2011-01-23 45 views
2

在搜索Stack Overflow和Google时,我很难找到明确的答案,希望有人能指点我正确的方向。MVC和EF4 CTP模型绑定和保存分层模型

我的情况 我希望能够使用单个编辑表单(在一个单一的视图)使用ASP.NET MVC 3和Entity Framework 4 CTP更新3级深层次的实体(代码 - 第一个) - 该模型由服务组成,该服务可以有许多服务选项,在Turn中可​​以有许多库存项目。

我期待能够使用MVCS默认的模型粘合剂(通过TryUpdateModel)到:

  1. 更新现有的“服务”记录
  2. 添加/更新/删除“服务选项”记录(附到服务),这取决于张贴值
  3. 添加/更新/删除“广告资源”记录(附加到每个服务选项),这取决于张贴值

中号Y型

[Bind(Include="Name, ServiceOptions")] 
public class Service { 
    [Key] 
    public int ServiceID { get; set; }  
    public string Name { get; set; }   
    public DateTime DateCreated { get; set; } 
    public virtual ICollection<ServiceOption> ServiceOptions { get; set; } 
} 

[Bind(Include="ServiceOptionID, Description, Tags")] 
public class ServiceOption { 
    [Key] 
    public int ServiceOptionID { get; set; } 
    public int ServiceID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
    public virtual ICollection<Inventory> InventoryItems { get; set; } 
} 


[Bind(Include = "InventoryID, Description")] 
public class Inventory { 
    [Key] 
    public int InventoryID { get; set; } 
    public int ServiceOptionID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
} 

理想控制器的方法:

[HttpPost] 
public ActionResult EditService(int id) { 
    Service service = db.Services.Single(s => s.ServiceID == id); 
    TryUpdateModel(service); // automatically updates child and grandchild records 

    if (ModelState.IsValid) {    
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(service); 
} 

有没有办法实现这个乌托邦梦想,还是我找错了树?我愿意使用其他技术(如普通EF4,Automapper等)

在此先感谢!

回答

0

只有默认的模型联编程序?可能不会。

有自定义吗?大概。

但是,您的问题不会是模型联编程序本身。你的问题是,EF和ORM以及(我认为)通常不会考虑从集合中删除一个项目作为删除操作。实际上,您告诉ORM的关系不存在,而不是需要删除子行。根据您的映射,您通常会收到“发生参照完整性约束违规事件”等错误。这不会因为代码第一,这就是EF的工作原理。

EF通过设计以这种方式工作,对于更复杂的关系非常重要,例如当您拥有引用其他m2m关系的m2m关系时。您真的希望EF能够消除呼叫以消除关系并呼吁完全移除行。另外,恕我直言,这种技术也是不好的,因为你让负责映射http值的代码也决定了对象应该如何持久化。这是一个不好的举措。我认为删除操作是非常神圣的行为,不应该仅仅留给ModelBinder。没有软删除或记录删除对象应被视为“严重的业务”。

+0

谢谢jfar ..所以,如果你需要发布一个单一的形式,其中更新到一个实体,它的子女和孙子们 - 你会怎么做呢?用DTOs?然后手动更新实体图以反映保存前的DTO内容? – Brendan 2011-01-25 00:23:43