0

これは私を夢中にさせています。他に何を試すべきかわかりません。これは、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 つまたは複数のアイテムを削除する方法を理解する必要がありますが、まず最初に...

4

1 に答える 1

0

継続的な試行錯誤の後、タスクの削除を含め、これは機能しているようです。他の誰かに役立つ場合に備えて、これを投稿すると思いました。また、これを必要以上に複雑にしていると誰かが言ってくれることを願っています。リスト プロパティを持つすべてのオブジェクトを保存するときに、これを記述するのは面倒でエラーが発生しやすいコードです。

private void AddTasksToApp(Application appNotAssociatedWithContext, Application appFromContext)
{
    foreach (TaskBase taskModified in appNotAssociatedWithContext.Tasks)
    {
        if (taskModified.IdForEf == 0)
        {
            appFromContext.Tasks.Add(taskModified);
        }
        else
        {
            TaskBase taskBase = appFromContext.Tasks.Single(x => x.IdForEf == taskModified.IdForEf);  // Get original task
            this.Database.Entry(taskBase).CurrentValues.SetValues(taskModified);  // Update with new
        }
    }

    // Delete tasks that no longer exist within the app.
    List<TaskBase> tasksToDelete = new List<TaskBase>();
    foreach (TaskBase originalTask in appFromContext.Tasks)
    {
        TaskBase task = appNotAssociatedWithContext.Tasks.Where(x => x.IdForEf == originalTask.IdForEf).FirstOrDefault();

        if (task == null)
        {                    
            tasksToDelete.Add(originalTask);
        }
    }

    foreach (TaskBase taskToDelete in tasksToDelete)
    {                
        appFromContext.Tasks.Remove(taskToDelete);
        this.Database.TaskBases.Remove(taskToDelete);
    }
}
于 2012-05-30T02:29:55.810 に答える