0

这让我发疯了。我不确定还能尝试什么。这是我使用 EF 4.3 更新另一个对象中的对象列表的最新尝试。

该场景是用户向其 Tasks 属性中已有一个任务的应用程序添加了一个新任务。应用程序未附加到数据库上下文,因为它是在先前的逻辑/数据库调用中检索到的。这是类和属性:

public class Application : EntityBase
{
    public ObservableCollection<TaskBase> Tasks { // typical get/set code here }
}

这是我更新列表的尝试。发生的情况是新任务被添加并且关联正确存在于数据库中。但是,未更改的第一个任务在数据库中删除了它的关联(它对应用程序的引用)。

这是采用用户修改的应用程序的 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
        }
    }
}

谁能明白为什么第一个任务会失去与数据库中的应用程序的关联?第一个任务通过上面代码中的 else 块。

接下来,我需要弄清楚如何删除一个或多个项目,但首先要做的是......

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 回答