我正在使用Automapper将数据从我的数据对象复制到我的视图模型对象。
cfg.CreateMap<Customer, CustomerVM>().ReverseMap();
cfg.CreateMap<Order, OrderVM>().ReverseMap();
Order
和Customer
之间有一个导航属性。这适用于在我的视图上显示复杂对象。
@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操作中的代码时,视图模型会显示所有相关对象中的更新数据。但是当我保存更改时,我只会更改保存到我的数据库的订单。我还需要做些什么来保存对相关对象的更改?
答案 0 :(得分:0)
从此link(将现有但已修改的实体附加到上下文部分):
请注意,如果附加的实体具有对其他实体的引用 尚未跟踪的实体,那么这些新实体将会 附加到
Unchanged
状态的上下文 - 他们不会 自动生成Modified
。如果你有多个实体 需要标记Modified
您应该为每个这些设置状态 单独的实体。
作为替代方案,有一个library (GraphDiff)允许您更新分离实体的整个图形。有关详细信息,请查看此post。在您的情况下,它将是:
context.UpdateGraph(order2, map => map.OwnedEntity(x => x.Customer)
.OwnedCollection(p => p.Notes));