实体框架抛出异常:索引超出数组范围

问题描述 投票:0回答:2

我一直在努力解决“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
c# sql entity-framework
2个回答
0
投票

删除此行

tutorial.User = user;


0
投票

正如 @behzad 所说,删除行 tutorial.User = user 因为它试图存储一个无效的对象,因此抛出索引越界错误。

© www.soinside.com 2019 - 2024. All rights reserved.