我环顾了几个小时,但我似乎无法找到解决问题的直接方法.
基本上,我有一对多的关系,与桌子桥接.我的控制器似乎完美地处理’create’方法,在’1’表和桥接’many’表中创建记录.
但是,’edit’方法似乎根本不修改/更新桥接表.关于我做错了什么的想法,以及为什么它与’创造’方法不同?
为简洁起见,我想说我有以下型号:
public class Incident { [Key] public int IncidentID { get; set; } public string Title { get; set; } public virtual ICollection<IncidentResources> Resources{ get; set; } }
和资源模型:
public class Resource { [Key] public int ResourceID{ get; set; } public int Name { get; set; } ...OTHER FIELDS REMOVED FOR BREVITY... }
我通过桥接表和模型桥接这两个:
public class IncidentResource { [Key] public int IncidentResourceID { get; set; } public int IncidentID { get; set; } public int ResourceID { get; set; } public virtual <Resource> Resource { get; set; } }
在我的控制器中,我有以下代码:
[HttpPost] public ActionResult Create(Incident incident) { //incident.Resources is returned as a valid object... if (ModelState.IsValid) { db.Incidents.Add(incident); db.SaveChanges(); return RedirectToAction("Index"); } return View(incident); }
以上工作完美!正如我所提到的,新事件被插入到正确的表中,并且分配给事件的所有资源都被添加到IncidentResources表中.
但是,以下代码不能以这种方式进行编辑…
[HttpPost] public ActionResult Edit(Incident incident) { if (ModelState.IsValid) { //THE USER CAN ADD ADDITIONAL RESOURCES foreach (IncidentResource r in incident.Resources) { r.IncidentID = incident.IncidentID; } db.Entry(incident).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(incident); }
同样,上面似乎对IncidentResources表没有任何作用.不会添加,删除或更新记录.我也没有收到错误.它只是没有做任何事情.
请注意,我不想删除桥表数据并重新插入.我将与那些我不想孤儿的数据建立一对多的关系.
我不明白这是如何运作的?
解决方法
您需要附加在EF外部创建的实体实例,并让EF知道它已被修改.
尝试添加:
db.Incidents.Attach(incident);
在改变状态之前.在您的情况下,您的最后一段代码应如下所示:
[HttpPost] public ActionResult Edit(Incident incident) { if (ModelState.IsValid) { //THE USER CAN ADD ADDITIONAL RESOURCES foreach (IncidentResource r in incident.Resources) { r.IncidentID = incident.IncidentID; } db.Incidents.Attach(incident); db.Entry(incident).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(incident); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。