これは私を夢中にさせています。他に何を試すべきかわかりません。これは、EF 4.3 を使用して別のオブジェクト内のオブジェクトのリストを更新する私の最新の試みです。
シナリオは、Tasks プロパティに既に 1 つのタスクがあるアプリケーションに、ユーザーが新しいタスクを追加した場合です。以前のロジック/DB 呼び出しで取得されたため、アプリケーションは DB コンテキストにアタッチされていません。これはクラスとプロパティです:
public class Application : EntityBase
{
public ObservableCollection<TaskBase> Tasks { // typical get/set code here }
}
これは、リストを更新する私の試みです。何が起こるかというと、新しいタスクが追加され、関連付けが DB に正しく存在します。ただし、変更されていない最初のタスクは、DB で関連付けが削除されています (アプリケーションへの参照)。
これは、ユーザーが変更したアプリケーションを取得する Save() メソッドです。
public void Save(Application newApp)
{
Application appFromContext;
appFromContext = this.Database.Applications
.Include(x => x.Tasks)
.Single(x => x.IdForEf == newApp.IdForEf);
AddTasksToApp(newApp, appFromContext);
this.Database.SaveChanges();
}
そして、これはEFを使用して保存するために明らかに必要なフーイーです:
private void AddTasksToApp(Application appNotAssociatedWithContext, Application appFromContext)
{
List<TaskBase> originalTasks = appFromContext.Tasks.ToList();
appFromContext.Tasks.Clear();
foreach (TaskBase taskModified in appNotAssociatedWithContext.Tasks)
{
if (taskModified.IdForEf == 0)
{
appFromContext.Tasks.Add(taskModified);
}
else
{
TaskBase taskBase = originalTasks.Single(x => x.IdForEf == taskModified.IdForEf); // Get original task
this.Database.Entry(taskBase).CurrentValues.SetValues(taskModified); // Update with new
}
}
}
最初のタスクが DB 内のアプリケーションへの関連付けを失っている理由を誰でも理解できますか? その最初のタスクは、上記のコードの else ブロックを通過します。
次に、1 つまたは複数のアイテムを削除する方法を理解する必要がありますが、まず最初に...