2012-05-30 4 views
0

Это сводит меня с ума. Я не уверен, что еще попробовать. Это моя последняя попытка обновить список объектов в другом объекте с помощью EF 4.3.Обновление детской коллекции с EF 4.3 - Устранительная ассоциация в DB

Сценарий состоит в том, что пользователь добавил новую задачу в приложение, у которого уже есть одна задача в свойстве 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 в вышеуказанном коде.

Далее, мне нужно, чтобы выяснить, как удалить один или несколько элементов, но первые вещи первый ...

ответ

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); 
    } 
} 
Смежные вопросы