3

创建新记录时出现上述错误。我不想插入身份——数据库是自动生成的,这很好。

这是确切的例外:

[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

如果我不使用继承,它可以正常工作。如果我使 Id 可覆盖并且还指定子类的属性,它仍然不起作用。

我做OnModelCreating这些只是因为我想让它工作。我觉得没有这个应该可以工作。当然,它甚至不适用于这个......

当我在 SQL Management Studio 中执行以下查询时,它可以正常工作:

insert into PartRevisions (originalid, revisiondate, revisionnumber, revisionby, partnumber, owner)
values (1, '1/1/2013', 1, 'eep', '123', 'ME')

这是完整程序的要点。我在一个测试项目中对此进行了尝试,因为我认为在 EF 中进行继承时会遇到一些问题(还没有完成)。

https://gist.github.com/eyston/4956444

谢谢!

4

2 回答 2

2

PartRevisions表不得将Id列设置为自动生成的标识,只能将表Parts设置为基本类型。这两个表具有共享主键。EF 在查询 a 时连接这两个表,如果插入了实体PartRevision,它会将行插入到两个表中。PartRevision因为两行必须相同,所以Id只有一个可以是一个标识。

于 2013-02-14T21:14:57.283 回答
0

从“Id”列中删除自动标识属性。或者,您可以在查询/存储过程中使用。即使设置了列上的自动标识,这也可以将显式 Id 值输入到您的表中。(虽然总是使用不是一个好主意,但它有利于修复)

SET IDENTITY_INSERT dbo.YourTableName ON;
GO

然后在每个表的插入之后:

SET IDENTITY_INSERT dbo.YourTableName OFF;
GO
于 2013-05-27T11:54:34.540 回答