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