2012-02-14 3 views
2

このアップデートを行うための方法はありますか?Entity Framework 4.0を使用しているときに、異なるテーブルの関連エントリを更新するにはどうすればよいですか?

void Update(Table1 table1Entry, Table2[] table2entries) 
{ 
    entities.Table1.Attach(table1Entry); 
    var table2EntriesIds = table2entries.Select(a => a.Id); 
    var updates = entities.Table2 
     .Where(a => table2EntriesIds.Contains(a.Id)); 
    foreach(var update in updates) 
    { 
     entities.Table2.Attach(update); 
    } 

    var deletions = entities.Table2 
     .Where(a => a.Table1Id == table1Entry.Id); 
     .Where(a => !table2EntriesIds.Contains(a.Id)); 
    foreach(var deletion in deletions) 
    { 
     entities.DeleteObject(deletion); 
    } 

    var insertions = table2entries.Except(matches); 
    foreach(var insertion in insertions) 
    { 
     entities.AddToTable2(insertion); 
    } 

    entities.SaveChanges(); 
} 

ここで、Table2にはTable1_Id外部キーがあります。

+0

このコードをテストしましたか? –

+0

@LadislavMrnkaいいえ、それは1つまたは2つのエラーが発生することがありますが、正しい場合にはまだ非常に長くなります –

答えて

1

アイデアは正しいです。あなたはそれを最適化することができます。例えば、更新と削除の関係を別々にロードすることはありませんが、エンティティの現在の分離状態をデータベース内の状態と手動で同期させる必要があります。エンティティグラフの状態を同期させる唯一の方法は、エンティティとリレーションごとに手動で行うことです。

あなたのコードが動作するかどうかです。私はそうは思わない。変更されるレコードの状態は変更されないため、レコードは更新されません。また、コンテキストから読み込まれたレコードを再度添付することもできません。それらのtable1とtable2が何らかの形で関係している場合の最後の点として、(FKプロパティを使用しない限り)リレーション自体で動作するコードは表示されません。

関連する問題