我一直在努力解决“AspNetUsers”表的外键问题。
为了澄清起见,我在 SQL Server 数据库中将该表重命名为
Users
。我的 Tutorial
表中有一个指向 Users
表的外键。这是我的 Tutorial
表的 EF 模型类:
public class Tutorial
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TutorialID { get; set; }
[Required]
public string TutorialTitle { get; set; }
[Required]
public string Description { get; set; }
[Required]
public string TutorialUrl { get; set; }
public string TutorialContent { get; set; }
public string UserId { get; set; }
public virtual AppUser User { get; set; } // this on is IdentityUser actually
public DateTime? Published { get; set; }
public bool HasBeenAcceptedForPublish { get; set; }
public string AdminMessageForNotPublishing { get; set; }
[Required]
public virtual TutorialStatus TutorialStatus { get; set; }
}
因此,在我更新数据库后,当我每次将新的
Tutorial
保存到 EF 时,都会抛出错误:
索引超出了数组的范围
我猜测
Users
表的外键有问题。这是与之相关的 AppUser
对象。如果有人能理解的话,我将在这里抛出 Tutorial
表的脚本,是什么引发了该异常/错误。
CREATE TABLE [dbo].[Tutorials]
(
[TutorialID] INT IDENTITY (1, 1) NOT NULL,
[TutorialTitle] NVARCHAR (MAX) NOT NULL,
[Description] NVARCHAR (MAX) NOT NULL,
[TutorialUrl] NVARCHAR (MAX) NOT NULL,
[TutorialContent] NVARCHAR (MAX) NULL,
[Published] DATETIME NULL,
[HasBeenAcceptedForPublish] BIT NOT NULL,
[AdminMessageForNotPublishing] NVARCHAR (MAX) NULL,
[TutorialStatus_TutorialStatusID] INT NOT NULL,
[UserId] NVARCHAR (128) NULL,
CONSTRAINT [PK_dbo.Tutorials]
PRIMARY KEY CLUSTERED ([TutorialID] ASC),
CONSTRAINT [FK_dbo.Tutorials_dbo.TutorialStatus_TutorialStatusID]
FOREIGN KEY ([TutorialStatus_TutorialStatusID])
REFERENCES [dbo].[TutorialStatus] ([TutorialStatusID])
ON DELETE CASCADE,
CONSTRAINT [FK_dbo.Tutorials_dbo.Users_Id]
FOREIGN KEY ([UserId])
REFERENCES [dbo].[Users] ([Id])
);
GO
CREATE NONCLUSTERED INDEX [IX_TutorialStatus_TutorialStatusID]
ON [dbo].[Tutorials]([TutorialStatus_TutorialStatusID] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_UserId]
ON [dbo].[Tutorials]([UserId] ASC);
更新:
这是创建新教程并尝试将其保存到数据库的代码。
public Tutorial CreateNewTutorial(string TutorialTitle, string Description, string content, AppUser user, out bool success)
{
try
{
string tutorialurl = null;
tutorialurl = TutorialTitle.Replace(" ", "-");
Tutorial tutorial = new Tutorial();
TutorialStatus status = new TutorialStatus();
status.ViewCount = 1;
status.ReputationPoints = 0;
status.FavouritedCount = 0;
context.TutorialStatus.Add(status);
context.SaveChanges();
tutorial.TutorialTitle = TutorialTitle;
tutorial.Description = Description;
tutorial.TutorialUrl = tutorialurl;
tutorial.User = user;
tutorial.UserId = user.Id;
tutorial.Published = null;
//tutorial.TutorialStatusID = status.TutorialStatusID;
tutorial.TutorialContent = content;
context.Tutorials.Add(tutorial);
context.SaveChanges();
success = true;
return tutorial;
}
catch
{
success = false;
return null;
}
}
更新2: 这是堆栈跟踪:
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.FindRelationshipSet(ObjectContext context, EntitySet entitySet, EdmType& relationshipType, RelationshipSet& relationshipSet)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.AttachContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.AttachContext(ObjectContext context, MergeOption mergeOption)
at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.CreateRelatedEnd[TSourceEntity,TTargetEntity](RelationshipNavigation navigation, RelationshipMultiplicity sourceRoleMultiplicity, RelationshipMultiplicity targetRoleMultiplicity, RelatedEnd existingRelatedEnd)
at System.Data.Entity.Core.Objects.DataClasses.RelationshipFixer`2.System.Data.Entity.Core.Objects.DataClasses.IRelationshipFixer.CreateSourceEnd(RelationshipNavigation navigation, RelationshipManager relationshipManager)
at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.GetRelatedEnd(RelationshipNavigation navigation, IRelationshipFixer relationshipFixer)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.GetOtherEndOfRelationship(IEntityWrapper wrappedEntity)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
at System.Data.Entity.Core.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
at System.Data.Entity.Internal.Linq.InternalSet`1.<>c__DisplayClassd.<Add>b__c()
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
at System.Data.Entity.DbSet`1.Add(TEntity entity)
at TutorialNetworkDomain.EFRepositories.EFHomeRepository.CreateNewTutorial(String TutorialTitle, String Description, String content, AppUser user, Boolean& success) in C:\\Users\\Jon\\Source\\Workspaces\\TutorialNetwork\\TutorialNetwork\\TutorialNetworkDomain\\EFRepositories\\EFHomeRepository.cs:line 362
删除此行
tutorial.User = user;
正如 @behzad 所说,删除行 tutorial.User = user 因为它试图存储一个无效的对象,因此抛出索引越界错误。