Vb.net 无法为标识列插入显式值
创建新记录时出现上述错误。我不想插入标识——数据库自动生成了标识,这很好 以下是确切的例外情况:Vb.net 无法为标识列插入显式值,vb.net,entity-framework,ef-code-first,Vb.net,Entity Framework,Ef Code First,创建新记录时出现上述错误。我不想插入标识——数据库自动生成了标识,这很好 以下是确切的例外情况: [System.Data.UpdateException] {"An error occurred while updating the entries. See the inner exception for details."} {"Cannot insert explicit value for identity column in table 'PartRevisions' when IDE
[System.Data.UpdateException]
{"An error occurred while updating the entries. See the inner exception for details."}
{"Cannot insert explicit value for identity column in table 'PartRevisions' when IDENTITY_INSERT is set to OFF."}
以下是映射:
Public Class PartContext
Inherits DbContext
Public Property Parts As DbSet(Of Part)
Public Property PartRevisions As DbSet(Of PartRevision)
Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
MyBase.OnModelCreating(modelBuilder)
modelBuilder.Entity(Of PartRevision)().HasKey(Function(r) r.Id).Property(Function(r) r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
End Sub
End Class
<Table("Parts")>
Public Class Part
<Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)>
Public Property Id As Integer
Public Property PartNumber As String
Public Property Owner As String
End Class
<Table("PartRevisions")>
Public Class PartRevision
Inherits Part
Public Property OriginalId As Integer
Public Property RevisionDate As DateTime
Public Property RevisionNumber As Integer
Public Property RevisionBy As String
End Class
以下是完整程序的要点。我在一个测试项目中尝试了这一点,因为我认为在EF中继承时会遇到一些问题(还没有完成)
谢谢 表
PartRevisions
不能将Id
列设置为自动生成的标识,只能将表Parts
设置为基本类型。这两个表具有共享的主键。EF在查询PartRevision
时连接两个表,如果插入了PartRevision
实体,它会在两个表中插入行。因为两行必须具有相同的Id
只有一行可以是标识。请从“Id”列中删除auto-identity属性。或者,也可以在查询/存储过程中使用。这将使您能够在表中输入显式Id值,即使在列上设置了自动标识。(虽然不是一个经常使用的好主意,但它有助于修复)
然后在每个表格插入后:
SET IDENTITY_INSERT dbo.YourTableName OFF;
GO
你得到了什么例外?为Body添加了例外谢谢。我只是从上下文中删除了一些部分,效果很好。有没有一种方法可以配置EF,使PartRevisions在表方面不与Part共享任何内容?@eyston:没有,这是模型中的继承如何映射到数据库架构的方法,基本上是:派生类=>表之间的共享主键。对于通过应用
属性配置的表每类型继承(TPT),至少是这种情况。您还可以使用每层次表(TPH)(通过删除该属性)。EF会期望在一个表中为基类型和派生类型指定所有列(Parts
)=表之间没有连接。我刚刚创建了一个“BasePart”,它既继承自,也可以工作。我没有意识到这会和我现在所做的有所不同。我不确定这是否是我想要做的,我只是想尝试一下,了解不同的处理方式。谢谢
SET IDENTITY_INSERT dbo.YourTableName ON;
GO
SET IDENTITY_INSERT dbo.YourTableName OFF;
GO