我正在使用SQL-Server 2016和Entity Framework Core。
假设我们希望将序列字符串用作序列作为表的主键 我已成功使用Code-First迁移创建表,并已将列的默认值设置为所需的concat(来自SSMS的屏幕截图):
当我使用INSERT命令手动向表中插入行时,它按预期工作。如果我选择省略列的值,则从序列生成它,否则 - 它使用提供的值。
但是,当我尝试按代码插入实体时 - 抛出异常
System.InvalidOperationException:'无法创建或跟踪'EntityName'类型的实体,因为它具有空主键或备用键值。'
实体的相关字段是一个简单的字符串属性。我尝试添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
注释,但这没有帮助。
编辑:当我调用Add (Sync)
堆栈跟踪 -
Result StackTrace:
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode node, Func`2 handleNode)
at Microsoft.EntityFrameworkCore.DbContext.SetEntityStates(IEnumerable`1 entities, EntityState entityState)
当我调用AddAsync
堆栈跟踪 -
Result StackTrace:
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode node, Func`2 handleNode)
at Microsoft.EntityFrameworkCore.DbContext.SetEntityStates(IEnumerable`1 entities, EntityState entityState)
at Microsoft.EntityFrameworkCore.DbContext.AddRangeAsync(IEnumerable`1 entities, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.AddRangeAsync(IEnumerable`1 entities, CancellationToken cancellationToken)
at (Rest of the stack trace...)
有什么建议吗?感谢
答案 0 :(得分:0)
我不认为Computed
是您想要的 - 计算意味着该值不是物理存储在服务器上,而是每次查询时计算的虚拟属性它,但我认为这不是这种情况。
你想要的是Identity
例如:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
您可以在此处详细了解这些选项:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.databasegeneratedoption(v=vs.110).aspx
答案 1 :(得分:0)
您可以尝试将StoreGeneratedPattern值设置为Identity。我正在使用Database First方法,并且设置此属性对我帮助很大。