次のようなテーブルのいくつかの行の追加データを格納するテーブルがあります。
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
// More fields here
}
PK を明示的に設定したこのテーブルに行を追加できるようにしたいと考えています。
上記のままにしておくと、値を設定して行を送信すると、値が破棄され、データベースから自動生成された値に置き換えられます (列は実際のスキーマで Identity 列として定義されます)。
これは正しい解決策のようです:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
// More fields here
}
ただし、代わりに例外が発生します。
IDENTITY_INSERT が OFF に設定されている場合、テーブル 'EnumTest' の ID 列に明示的な値を挿入できません。
では、EF で主キーの値を設定できるようにクラスを作成するにはどうすればよいでしょうか。
編集:
IDENTITY_INSERT を ON に設定するために、次のコードベースの移行を追加しようとしました。
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
実行して再試行しましたが、上記と同じ例外が発生しました。奇妙なのは、データベースがこの設定を反映しており、それに対して SQL を直接実行すると、主キーに任意の値を挿入できることです。そのため、Entity Framework 自体がこのルールを適用し、IDENTITY_INSERT が含まれていないことを認識していないように見えます。実際にはオフに設定されています。EF自体のどこかに設定する必要がありますか?
編集2:
IDENTITY_INSERT を誤解しました。一度設定すると、そのテーブルで無期限にそのままになっていると思いました。実際、それは「セッション」である限り存続します。つまり、たとえば、移行で設定すると、存続することを意味します...その移行が実行され、EF を使用した後の .Add() のような将来の接続に影響を与えない限り、これは私がまだその例外を受け取った理由を説明しています-DBは実際にはEFではなく例外の原因です。IDENTITY_INSERT はセッションごとに最大で 1 つのテーブルに制限されているため、これを行うにはかなり非効率的な方法です。最初に Identity PK 列を作成しない方がよい方法のように思えます。