2017-02-13 10 views
0

Я использую .net MVC 4 и EF 5. У меня есть модель с Master деталь структуры, как:MVC редактировать комплексная модель ICollection свойство

public partial class Master 
    { 
    public int IdMaster { get; set; } 
    public String MasterName {get; set;} 

    public virtual ICollection<Detail> details { get; set; } 
    } 

    public partial class Detail 
    { 
    public int IdDetail { get; set; } 
    public String DetailName{get; set;} 

    public virtual Master master { get; set; } 
    } 

Я создал «Создать» вид, где у меня есть вход поля для кода Master и js для добавления рядов деталей. Все, вилы отлично, «Создать» HTTP POST-контроллер связывает все отлично и код:

context.Master.Add(master); 
    context.SaveChanges(); 

вставки как в главных и подчиненных таблицах.

Но когда я делаю Редактировать сообщение ... мой отладчик говорит мне, что привязка хорошая, у меня есть некоторые обновления на некоторых деталях строк и некоторые новые строки, например ... , но после заполнения сообщения я получаю только обновления мастер-таблицы, а Detail - то же, что и до редактирования.

В настоящее время я использую обходное решение, делясь всеми деталями и вставляя их в «Редактирование» элемента управления до редактирования мастера, но мне интересно, если есть разрешение, где EF может обнаружить эти изменения и иметь дело с деталями ...

Update 1:

[HttpPost] 
public ActionResult Edit(Master master) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(master).State = EntityState.Modified; 
      db.SaveChanges(); 
      -- this updates only the Master table 
      -- but my Collection Master.details which has some new and some updated 
      -- element properties does not change in database. 
-- How can EF do adding, deleting and inserting into Details table based on my Collection????? 
     } 
    } 

Спасибо за ваше время

+0

привет вы можете показать код whehere вы редактировали детали –

+0

Я просто сделать это: context.Entry (мастер) .State = EntityState.Modified; context.SaveChanges(); – djomla87

+0

Итак, вам нужно сначала прочитать один и тот же объект из контекста и применить обновления к свойству spefici, если вы хотите обновить определенное свойство, которое необходимо обновить, а затем установить состояние, измененное по вашему усмотрению, тогда оно должно работать. –

ответ

0

с той же enitymodel я могу обновить данные. Ниже приведен пример кода. Поскольку вы больше не использовали код, я предполагаю, что у вас должен быть идентификатор masterid и detail, а затем вы его обновляете.

 using (var context = new TestDbContext()) 
     { 
      var master = context.Master.Include(x=>x.details).FirstOrDefault(f => f.IdMaster == 1); 
      if(master!=null) 
      { 
       // hre if you want to update the detail with id detaiid= 1 

       var detail = master.details.FirstOrDefault(d => d.IdDetail == 1); 
       if (detail != null) 
       { 
        detail.DetailName = "update detail"; 
       } 
       context.Entry(master).State = EntityState.Modified; 
       context.SaveChanges(); 
      } 
     }