将更新的复杂模型保存到复杂的实体框架实体?

时间:2016-08-19 20:26:17

标签: asp.net-mvc entity-framework automapper

我正在使用Automapper将数据从我的数据对象复制到我的视图模型对象。

cfg.CreateMap<Customer, CustomerVM>().ReverseMap();
cfg.CreateMap<Order, OrderVM>().ReverseMap();

OrderCustomer之间有一个导航属性。这适用于在我的视图上显示复杂对象。

@Html.EditorFor(a => a.Customer.AccountName)
@Html.EditorFor(a => a.Notes)

对象似乎在我的后期动作中正确映射回来。

[HttpPost]
public ActionResult SaveOrder(OrderVM order)
{
        if (ModelState.IsValid)
        {
            var order2 = AutomapperConfig.MapperConfiguration.CreateMapper().Map<OrderVM, Order>(order);
            order2.LastEditDate = DateTime.Now;
            order2.LastEditBy = HttpContext.User.Identity.Name;
            order2.CreateDate = order.CreateDate;

            using (var db = new ProofingContext())
            {                  
                db.Entry(order2).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("index");
            }
        }

        return View();
}

当我逐步执行post操作中的代码时,视图模型会显示所有相关对象中的更新数据。但是当我保存更改时,我只会更改保存到我的数据库的订单。我还需要做些什么来保存对相关对象的更改?

1 个答案:

答案 0 :(得分:0)

从此link将现有但已修改的实体附加到上下文部分):

  

请注意,如果附加的实体具有对其他实体的引用   尚未跟踪的实体,那么这些新实体将会   附加到Unchanged状态的上下文 - 他们不会   自动生成Modified。如果你有多个实体   需要标记Modified您应该为每个这些设置状态   单独的实体。

作为替代方案,有一个library (GraphDiff)允许您更新分离实体的整个图形。有关详细信息,请查看此post。在您的情况下,它将是:

 context.UpdateGraph(order2, map => map.OwnedEntity(x => x.Customer)
                                       .OwnedCollection(p => p.Notes));