【问题标题】:MVC and EF4 CTP model-binding and saving hierarchical modelMVC与EF4 CTP模型绑定与保存分层模型
【发布时间】:2011-01-23 23:15:59
【问题描述】:

在搜索 Stack Overflow 和 Google 时,我无法找到明确的答案,希望有人能指出我正确的方向。

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

我希望能够使用 MVC 的默认模型绑定器(通过 TryUpdateModel)来:

  1. 更新现有的“服务”记录
  2. 根据发布的值添加/更新/删除“服务选项”记录(附加到服务)
  3. 根据发布的值添加/更新/删除“库存”记录(附加到每个服务选项)

我的模型

    [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 等)

提前致谢!

【问题讨论】:

    标签: asp.net-mvc entity-framework automapper ef4-code-only


    【解决方案1】:

    仅使用默认模型绑定器?应该不会吧。

    有一个定制的?大概吧。

    但是,您的问题不在于模型绑定器本身。您的问题将是 EF 和 ORM 以及(我认为)通常不会考虑从集合中删除项目作为删除操作。实际上,您告诉 ORM 的是关系不存在,而不是需要删除子行。根据您的映射,您通常会收到“发生引用完整性约束违规”之类的错误。这不是因为代码优先,这就是 EF 的工作方式。

    EF 通过设计以这种方式工作,对于更复杂的关系非常重要,例如当您拥有引用其他 m2m 关系的 m2m 关系时。您真的希望 EF 能够区分删除关系的调用和完全删除行的调用。

    另外,恕我直言,这种技术也很糟糕,因为您让负责映射 http 值的代码也决定了对象应该如何持久化。这是一个糟糕的举动。我认为删除操作是一种非常神圣不可侵犯的行为,不应该只留给 ModelBinder。没有软删除或记录删除对象应该被视为“严肃的事情”。

    【讨论】:

    • 谢谢 jfar.. 所以如果您需要发布一个表单,该表单将更新到一个实体、它的子代和孙代 - 您会怎么做呢?使用 DTO?然后在保存之前手动更新实体图以反映 DTO 内容?
    猜你喜欢
    • 2014-01-19
    • 2023-03-06
    • 2012-11-13
    • 1970-01-01
    • 2015-07-17
    • 2014-04-18
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多