2

在搜索 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 等)

提前致谢!

4

1 回答 1

0

仅使用默认模型绑定器?可能不是。

有定制的吗?大概。

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

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

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

于 2011-01-24T01:05:52.333 回答