我一直在努力争取外国人的钥匙。 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
答案 0 :(得分:1)
删除此行tutorial.User = user;