1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【EntityFrameWork】外部参照を持ったレコードの追加でエラー

Last updated at Posted at 2018-07-13

数時間嵌ってしまった。
取り急ぎメモ

DB構造

Table1のNameはいくつかの決まった値をとる様制限したいので、
Table1.NameIDは外部参照でNameListのIdを見る様にしました。
diaglam.png

やりたいこと

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();//これでエラー発生しない!
}
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?