Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework throws exception: index was outside the bounds of the array

I've been struggling with having a foreign key to' AspNetUsers' table a lot.

I renamed the table to Users in my SQL Server database just to clarify. I have a foreign key in my Tutorial table to the Users table. Here's my EF model class for Tutorial table:

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; }
}

So after I updated database, when every I save new Tutorial to EF, it throws an error:

Index was outside the bounds of the array

I'm guessing that there is something wrong with foreign key to the Users table. It's the AppUser object that is related to. I'm gonna throw here script for Tutorial table if anyone could make sense, what is throwing that exception/error.

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); 

UPDATE:

Here is the code which creates the new tutorial and tries to save it to database.

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;
    }
}

UPDATE 2: Here's the stacktrace:

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
like image 242
Jon Koivula Avatar asked Nov 09 '22 08:11

Jon Koivula


1 Answers

Remove this Line tutorial.User = user;

like image 138
behzad1986 Avatar answered Nov 14 '22 21:11

behzad1986