这让我发疯了。我不确定还能尝试什么。这是我使用 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 块。
接下来,我需要弄清楚如何删除一个或多个项目,但首先要做的是......