2016-11-30 4 views
1

EFでいくつかのテーブルを作成し、プライマリキーを使用していくつかのカラムに値を与えるシードデータを入力しました。私がアプリケーションを実行すると、エラーメッセージが表示されます。.netコアでidentity-insertを有効にする方法

IDENTITY_INSERTがOFFに設定されている場合、テーブル 'Persons'のID列に明示的な値を挿入できません。

どうすればいいですか?私が使用することをここに読み:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]主キーである財産上の

。残念ながら同じエラーメッセージが表示されています。助けてください。

更新*

私は主キーを持っているすべての私のプロパティに[DatabaseGenerated(DatabaseGeneratedOption.None)]を追加しました。移行を実行すると、ID列が削除されていることがわかりますが、まだ同じエラーメッセージが表示されています。

私がSQL SEOに入ると、プライマリキーにID列が表示されます。私はデータベースをリフレッシュしようとしました。私は間違って何をしていますか?私ができることは、プロパティに入り、アイデンティティを削除することだけですが、なぜ私はそれを上記の方法で行うことができませんか?助けてください。

+0

https://docs.microsoft.com/en-us/ef/core/index –

+0

プライマリキー列がID列でないようにするか、一時的にそのIDをオフにして手動でいくつかのレコードのいくつかのキー値を割り当てることができますか? –

+0

IDENTITY_INSERTをオフにするSQL文は、テーブル名が 'mytable'でスキーマが' dbo'であると仮定すると、 'SET IDENTITY_INSERT [dbo]。[mytable] OFF'です。 IDENTITY_INSERTをoffに設定する理由は、主キーの値を手動で設定しないようにするためです。 – kimbaudi

答えて

4

EFコア1.1.2では、これをトランザクションで処理するようにしました。私の "データベース初期化"では、シードデータをテーブルに入れました。私はthis EF6 answerから技術を使用しました。ここでは、コードのサンプルです:

using (var db = new AppDbContext()) 
using (var transaction = db.Database.BeginTransaction()) 
{ 
    var user = new User {Id = 123, Name = "Joe"}; 
    db.Users.Add(user); 
    db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MyDB.Users ON;"); 
    db.SaveChanges(); 
    db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MyDB.Users OFF"); 
    transaction.Commit(); 
} 
0

もう一つの方法は、明示的にSET IDENTITY_INSERT <table> ON接続を開くことです。

var conn = context.Database.GetDbConnection(); 
if (conn.State != ConnectionState.Open) 
    conn.Open(); 

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Posts ON"); 

var post = new WeblogPost() 
{      
       Id= oldPost.Pk, // <!--- explicit value to Id field 
       Title = oldPost.Title, 
       ... 
}; 
context.Posts.Add(post);  
conn.Close(); 

はどうやら一度接続が明示的に接続を自動的にEFによって閉じられていないことを、EF要求の前に開かれているので、設定は同じ接続コンテキストに適用されます。

スティーブのトランザクションに対する応答が、トランザクションが接続を維持しているのと同じ理由です。

注:あなたは、後でアプリケーション/要求に再び同じコンテキストを使用する予定場合using声明への接続を配置する必要はありません。接続が存在する必要があるため、接続コンテキストをクリアする最善の方法は.Close()です。これにより、EFを操作ごとの接続のオープンおよびクローズのデフォルト動作に戻します。

関連する問題