【EntityFrameWork】外部参照を持ったレコードの追加でエラー
数時間嵌ってしまった。
取り急ぎメモ
DB構造
Table1のNameはいくつかの決まった値をとる様制限したいので、
Table1.NameIDは外部参照でNameListのIdを見る様にしました。
やりたいこと
Table1のレコードを追加したい。
NameIDをセットしてAddじゃなく、NameListのインスタンスをセットした状態のインスタンスでレコードを追加したい。
//---------------こうではなく--------------------//
using(var context = new DBEntities())
{
var table1Instacse = new Table1();
//NameIDを設定し <- ダサい
table1Instacse.NameID = context.NameList.Where(a => a.ItemName == "設定したい名前").First()?.Id;
//レコード追加
context.Table1.Add(table1Instance);
//問題なくSave成功
context.SaveChanges();
}
//---------------こうしたい--------------------//
using(var context = new DBEntities())
{
var table1Instacse = new Table1();
//NameListのインスタンスをセットして
table1Instacse.NameList = context.NameList.Where(a => a.ItemName == "設定したい名前").First();
//レコード追加
context.Table1.Add(table1Instance);
context.SaveChanges();//<-エラー発生
}
エラーの原因
Exceptionはこれが発生。
System.Data.Entity.Infrastructure.DbUpdateException:
'エントリを更新中にエラーが発生しました。詳細については、内部例外を参照してください。'
innerを見てみると
System.Data.SqlClient.SqlErrorCollection:
Violation of PRIMARY KEY constraint 'PK__NameList'.
Cannot insert duplicate key in object 'dbo.NameList'. The duplicate key value is (1).
The statement has been terminated.
なんでNameListに追加しようとしてるの??
解決策
今回の場合はこここがドンピシャ
https://stackoverflow.com/questions/7082744/cannot-insert-duplicate-key-in-object-dbo-user-r-nthe-statement-has-been-term
using(var context = new DBEntities())
{
var table1Instacse = new Table1();
table1Instacse.NameList = context.NameList.Where(a => a.ItemName == "設定したい名前").FirstOrDefault();
context.NameList.Attach(table1Instance.NameList);//定義済みであることを伝える
context.Table1.Add(table1Instance);
context.SaveChanges();//これでエラー発生しない!
}
Author And Source
この問題について(【EntityFrameWork】外部参照を持ったレコードの追加でエラー), 我々は、より多くの情報をここで見つけました https://qiita.com/satorimon/items/8f104897ad4a753fc805著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .