3

新しいレコードを作成するときに上記のエラーが発生します。ID を挿入したくありません。データベースには ID が自動生成されており、これは素晴らしいことです。

正確な例外は次のとおりです。

[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

テーブルには、自動生成された ID として設定された列が含まれPartRevisionsていてはならず、基本型のテーブルのみが含まれている必要があります。2 つのテーブルは主キーを共有しています。EF は、クエリを実行するときに 2 つのテーブルを結合し、エンティティが挿入されている場合は両方のテーブルに行を挿入します。両方の行が同じである必要があるため、ID にできるのは 1 つだけです。IdPartsPartRevisionPartRevisionId

于 2013-02-14T21:14:57.283 に答える