MVC编辑复杂模型ICollection属性

时间:2017-02-13 12:16:23

标签: asp.net-mvc entity-framework controller master-detail

我正在使用.net MVC 4和EF 5。 我有一个具有Master详细结构的模型,如:

    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; }
    }

我创建了一个&#34;创建&#34;查看我有Master和js代码的输入字段 用于添加详细信息行。一切都完美无瑕,&#34;创造&#34; HTTP POST控制器完美地绑定所有内容并编写代码:

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

在Master表和Detail表中插入。

但是当我做编辑帖子时...我的debuger告诉我绑定是好的,我在一些Detail行和一些新行上有一些更新例如...... 但在完成帖子后,我只获得Master表的更新,而Detail与编辑前相同。

目前,我正在使用解决方法,删除所有细节并将其重新插入&#34;编辑&#34;编辑主人之前的控制器,但是如果有一个解决方案,EF可以检测到这种变化并处理细节,我很有意思......

更新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?????
        }
    }

感谢您的时间

1 个答案:

答案 0 :(得分:0)

使用相同的enitymodel,我可以更新详细信息。下面是示例代码。由于您还没有共享任何代码,我认为您必须具有masterid和detail id,然后您正在更新它。

     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();
            }
        }