我正在使用.net MVC 4和EF 5。我有一个具有主细节结构的模型,如下所示:
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; }
}
我创建了一个"创建"视图,其中有主代码和js代码的输入字段用于添加详细信息行。一切都完美分叉,"创建"HTTP POST控制器完美地绑定了所有内容并编码:
context.Master.Add(master);
context.SaveChanges();
在"主"表和"详细信息"表中插入。
但是当我做编辑帖子时......我的调试器告诉我绑定很好,我对一些详细信息行和一些新行有一些更新,例如......但是在完成帖子后,我只得到主表的更新,而细节与编辑之前相同。
目前,我正在使用解决方法,方法是在编辑主控之前删除所有详细信息并将它们重新插入"编辑"控制器中,但如果有一个解决方案,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?????
}
}
感谢您抽出宝贵时间
使用相同的 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();
}
}