实体框架:更新相关实体

时间:2011-12-23 11:38:54

标签: asp.net-mvc-3 entity-framework-4

我有两个实体:Invoice和InvoiceDetail。

Invoice有一个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();
        ...

我还想更新发票和相关的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/

2 个答案:

答案 0 :(得分:1)

当您致电ChangeObjectState时,您正在改变单个实体的状态,关系保持不变状态。因此,如果您只修改现有发票详细信息,则可以简单地迭代这些详细信息并将其设置为修改状态。如果您还可以添加或删除详细信息,则它将为much more complicated,您必须手动将请求中的状态与数据库中的状态同步(首先从@Hammerstein建议的数据库中加载发票详细信息)或使用某些约定查找必须将哪些详细信息设置为已删除或添加状态,而不在数据库中进行检查。

答案 1 :(得分:0)

我没有使用Attach多,通常我查询数据库,更新记录和ave更改。但我相信您附加的发票与发票明细没有相同的关联。您需要将该记录拉出来,更新它然后保存更改。