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