-1

場合によっては、データに追加するエンティティの主キーとして特定のIDを挿入する必要があります。従来のMSSQLでは、ステートメントを呼び出すSET IDENTITY_INSERT tablename ON前に呼び出すことでこれを行うことができます。INSERT INTOEF4.1コードファーストを使用して同じことを行う方法を理解できないようです。

Dim specificIdRecord As New Record() With {
    .RecordID = 25,
    'other settings here
}

myDbContext.Records.Add(specificIdRecord)
myDbContext.SaveChanges()

specificIdRecord.RecordID '<== this does not always equal 25!

RecordIDを無視して自動的に生成していることを示すエラーもスローされません。

注:これは時折の挿入操作のみを目的としているため、モデルを変更したり、コンテキストを変更したりしたくありません。また、挿入の実行の前後を手動で設定することで可能な解決策を見ましたが、これには3つのトランザクションが必要です。EFでこれをすべて1つにまとめてください。ExecuteStoreCommandIDENTITY_INSERT

4

1 に答える 1

1

EFはこれをサポートしていません。データベースで列を使用する場合IDENTITY、マッピングにはこの情報が含まれ、データベースにキー値を送信することはできません(EFは自動的にそれをスキップします)。

この場合の最良のオプションは、設定コマンドとSQLコマンドExecuteStoreCommandの両方に使用することです。IDENTITY_INSERTINSERT

EFに基づく回避策には、2つの異なるEFマッピングが必要です。1つはデータベース生成としてキーが設定されており、もう1つはこの設定がありません。明示的なキー値を挿入する場合は、最初のマッピングを一般的な処理に使用し、2番目のマッピングを使用します。2つのマッピングを使用するということは、2つの異なるEDMXファイルまたは2つの異なるDbModelBuilderインスタンス(2つのコンテキストタイプ)を使用することを意味します。

2つのマッピングができたら、IDENTITY_INSERTオンとオフの問題を解決する必要があります。これには、生成された各コマンドにそれらのSQLコマンドをアタッチするためのカスタムプロバイダーラッパーを作成する必要がありますINSERT

于 2012-08-07T09:29:39.190 に答える