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
Remove this Line tutorial.User = user;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With