2015-03-05 3 views
0

Буду признателен за любые советы.Обновить модель с вложенной коллекцией, ASP.NET MVC

Я искал правильный подход к изменению коллекции, но не уверен, что является лучшим.

Я сущность с вложенной коллекции:

public class Customer 
{ 
    //customer properties 
    ICollection <Address> Addresses{get; set;} 
} 

Мой Edit вид на Customer включает Addresses, а также, т.е. пользователь добавляет адреса динамически, и вся коллекция передается в контроллер по форме submittion. В контроллере я обновить Customer, как обычно:

Context.Entry(customer).State = EntityState.Modified; 

А также я должен обновить коллекцию Address:

customer.Addresses.ToList() 
        .ForEach(p => 
          Context.Entry(p).State = EntityState.Modified); 

Он отлично работает до тех пор пока я добавить новую запись в Addresses. Поскольку он не существует в БД, сохранение вызывает ошибку.

Я знаю, что могу проверить, существует ли запись в БД - изменить, в противном случае - добавить.

Но есть проблема в объекте Address. Это первичный ключ, например ID, является Identity, то есть автоматически увеличивается при добавлении в DB.

Итак, изначально в коллекции нового Address будет ID, равного 0. Затем, если добавить один Address в контексте, то, прежде чем добавить еще один, я проверяю, если второй Address в контексте, он возвращает истину, потому что первый из них также с ID = 0.

Кроме того, в порядке, Я могу удалить всю коллекцию и добавить ее снова, но это может повлиять на производительность.

Итак, я был бы так благодарен за ваши советы.

ответ

2

Вы можете перебрать по адресам и проверить id. На основе значения можно установить состояние записи объекта в Added или Modified. В этом случае вам не нужно воссоздавать коллекцию.

foreach (var a in customer.Addresses) 
    { 
       model.Entry(a).State = a.ID == 0 ? EntityState.Added :EntityState.Modified; 
    } 

Вы можете использовать тот же подход для клиента, конечно.

+0

Что делать, если некоторые из записей удалены? Проверить оставшиеся в БД существующие в текущей коллекции? Я надеялся, что есть более элегантное решение. –

+0

Entity Framework удалит удаленные записи из вашей базы данных. – masterw

Смежные вопросы