Asp.net mvc MVC和EF4 CTP模型绑定和保存分层模型

Asp.net mvc MVC和EF4 CTP模型绑定和保存分层模型,asp.net-mvc,entity-framework,automapper,ef4-code-only,Asp.net Mvc,Entity Framework,Automapper,Ef4 Code Only,在搜索Stack Overflow和Google时,我很难找到一个清晰的答案,希望有人能给我指出正确的方向 我的处境 我希望能够使用单个编辑表单(在单个视图中)使用ASP.NET MVC 3和entity Framework 4 CTP(代码优先)更新一个三级深层层次实体-该模型由服务组成,服务可以有许多服务选项,而服务选项又可以有许多库存项 我希望能够使用MVCs默认模型绑定器(通过TryUpdateModel)来: 更新现有的“服务”记录 根据发布的值添加/更新/删除“服务选项”记录(附加到

在搜索Stack Overflow和Google时,我很难找到一个清晰的答案,希望有人能给我指出正确的方向

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

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

  • 更新现有的“服务”记录
  • 根据发布的值添加/更新/删除“服务选项”记录(附加到服务)
  • 根据过账值添加/更新/删除“库存”记录(附加到每个服务选项)
  • 我的型号

        [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; }
    }
    
    有没有办法实现这个乌托邦式的梦想,还是我找错了方向?我愿意使用其他技术(如普通EF4、Automapper等)


    提前谢谢

    仅使用默认的模型绑定器?可能不会

    要定制的吗?可能吧

    然而,您的问题将不是模型绑定器本身。您的问题将是EF和ORMs,(我认为)一般不会考虑将一个项目从一个集合中删除作为删除操作。实际上,您告诉ORM的是关系不存在,而不是需要删除子行。根据映射的不同,通常会出现类似“发生引用完整性约束冲突”的错误。这不是因为代码优先,这只是EF的工作方式

    EF的工作方式是通过设计实现的,对于更复杂的关系来说非常重要,例如当您拥有引用其他m2m关系的m2m关系时。您确实希望EF能够消除删除关系的调用和完全删除行的调用之间的歧义


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

    仅使用默认的模型绑定器?可能不会

    要定制的吗?可能吧

    然而,您的问题将不是模型绑定器本身。您的问题将是EF和ORMs,(我认为)一般不会考虑将一个项目从一个集合中删除作为删除操作。实际上,您告诉ORM的是关系不存在,而不是需要删除子行。根据映射的不同,通常会出现类似“发生引用完整性约束冲突”的错误。这不是因为代码优先,这只是EF的工作方式

    EF的工作方式是通过设计实现的,对于更复杂的关系来说非常重要,例如当您拥有引用其他m2m关系的m2m关系时。您确实希望EF能够消除删除关系的调用和完全删除行的调用之间的歧义


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

    谢谢jfar。。因此,如果您需要发布一个表单,其中包含实体及其子代和孙辈的更新,您将如何处理?使用DTO?然后在保存之前手动更新实体图以反映DTO内容?谢谢jfar。。因此,如果您需要发布一个表单,其中包含实体及其子代和孙辈的更新,您将如何处理?使用DTO?然后在保存之前手动更新实体图以反映DTO内容?
        [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);
    }