Entity Framework throws exception: index was outside of array
I have tried my best to have a foreign key to the AspNetUsers table.
I renamed the table in Users
in my SQL Server database to clarify. I have a foreign key on my table Tutorial
in a table Users
. Here's my EF model class for the table Tutorial
:
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 updating the database, whenever I save a new one Tutorial
to EF, it throws an error:
The index was outside the array
I am guessing there is something wrong with the foreign key in the table Users
. This is the object AppUser
that is associated with. I'm going to throw a script here for the table Tutorial
in case anyone might make sense what is throwing this 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 that creates a new tutorial and tries to save it to the 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
source to share