2011-12-23 211 views
3

我有两个实体:Invoice和InvoiceDetail。实体框架:更新相关实体

发票有一个InvoiceDetails成员。

当我创建一个obcjet时,它按预期工作。

框架在数据库中插入Invoice和InvoiceDetail行。

$.ajax({ 
    url: "/Invoices/Index", 
    data: JSON.stringify({ 
     InvoiceDetails: [{ 
      Description: "1" 
     }, { 
      Description: "2" 
     }] 
    }), 
    contentType: "application/json", 
    type: "POST" 
}); 

    [ActionName("Index")] 
    [HttpPost] 
    public JsonResult Post(Invoice invoice) 
    { 
     db.Invoices.AddObject(invoice); 
     db.SaveChanges(); 
     ... 

我还想更新Invoice和相关的InvoiceDetails。

$.ajax({ 
    url: "/Invoices/Index/1", 
    data: JSON.stringify({ 
     Id: 1, 
     InvoiceDetails: [{ 
      Id: 1, 
      Description: "1*" 
     }, { 
      Id: 2, 
      Description: "2*" 
     }] 
    }), 
    contentType: "application/json", 
    type: "PUT" 
}); 

    [ActionName("Index")] 
    [HttpPut] 
    public JsonResult Put(Invoice invoice) 
    { 
     db.Invoices.Attach(invoice); 
     db.ObjectStateManager.ChangeObjectState(invoice, EntityState.Modified); 
     db.SaveChanges(); 
     ... 

但框架只更新发票。

如何更新相关实体?

我的模型看起来像这样

enter image description here

编辑:解 http://michele.berto.li/update-of-an-object-and-related-records-with-backbonejs-and-net-mvc

更新的链接 http://michele.berto.li/update-of-an-object-and-related-records-with-backbone-js-and-net-mvc/

回答

1

当您致电ChangeObjectState您正在更改单个实体的状态,关系保持不变状态。所以如果你只修改现有的发票细节,你可以简单地迭代这些细节,并将它们设置为修改状态。如果您还可以添加或删除详细信息,那么它将为much more complicated,您将不得不手动将请求中的状态与数据库中的状态同步(以@Hammerstein建议的形式首先从数据库加载发票,然后使用一些约定来查找哪些详细信息被设置为删除或添加状态而不在数据库中检查它。

+0

我有一个控制器'HttpPost'操作,用于处理提交复杂表单的操作,该表单由一个实体及其导航属性组成,这些属性可以是由于删除,某些新项目,某些修改而丢失的某些项目的集合,以及与单个对象导航相同。可以为零的属性(FK属性可以为空),修改为新实体,修改现有或许多其他选项。有关如何管理EF中相关实体的统一方法?由于缺乏明确统一的方式来执行此类操作,整个事情开始变得混乱。 – Shimmy 2015-04-19 04:23:20

+0

关于2015年这个问题的任何消息?任何方式轻松更新整个图形,包括删除相关实体? – Shimmy 2015-04-19 22:18:42

0

我不附加太多的工作,通常我查询数据库,更新记录和大改变。但我相信您所附的发票与发票明细没有相同的关联。您需要将该记录取出,更新并保存更改。