2016-06-01 11 views
0

personという名前の新しいオブジェクトを作成し、addressというデータベース内のレコードに接続したいとします。私が行ってPersonオブジェクトを保存するとき、私は2回目のアドレスを挿入して複製を作成したくありません。これをEFで処理する最良の方法は何ですか?Entity Frameworkオブジェクトの状態new/existing

+0

は、あなたの人物オブジェクトを作成した後、あなたは、単にそのアドレスメンバーを設定した人の記録を、使用方法を追加し、変更を保存 – Kevorkian

+0

ええけど、私は(挿入)保存したい –

+0

単純に(人)メソッド、および場合addを使用あなたが住所にいる人への参照がある場合は、更新する必要があります。 – Kevorkian

答えて

1

これを行う最も良い方法は、オブジェクト全体ではなく、外部キーフィールドのみを設定することです。例えば

、ここで

Person p = new Person(); 
p.Name = "John Doe"; 
p.AddressId = 12345; 
context.People.Add(p); 
context.SaveChanges(); 

はEFがレコードを複製する理由を説明するジュリー・ラーマンによって素晴らしい記事です。 https://msdn.microsoft.com/en-us/magazine/dn166926.aspx

+0

これは、PersonクラスにAddressナビゲーションプロパティに加えてAddressIdプロパティがある場合にのみ機能することに注意してください。 –

+0

ナビゲーションプロパティにIDがあり、IDにEFが重複を作成した場合 –

+0

アドレスが存在し、その人物が新規の場合は、アドレスナビゲーションプロパティを設定しないでください。コードで設定する場合は、外部キーIDフィールドを設定しているかどうかにかかわらず、アドレスがすでに存在しているか、新しいアドレスが作成されることをEFに伝える必要があります。私が参照した記事(context.Entry(topic).State = EntityState.Unchanged)は、既存のアドレスを無視するようにEFに指示している行です。私が提供した答えを使用するナビゲーションプロパティではなく、IDフィールドだけを設定してください。それ以外の場合は、Julieがコード内でエンティティの状態を示唆し、管理するために行う必要があります。 – user1011627

関連する問題