所以我有一个视图,我修改了一个“复杂”对象,意味着它有其他对象的集合,你知道通常的事情:
[Table("Customer")]
public class Customer
{
[Key, Column("IdCustomer")]
public int IdCustomer {get; set;}
[Column("FirstName")]
public string FirstName { get; set;}
[Column("LastName")]
public string LastName { get; set;}
public virtual List<Order> Orders { get; set; }
}
[Table("Order")]
public class Order
{
[Key, Column("IdOrder")]
public int IdOrder {get; set;}
[Column("Quantity")]
public int Quantity {get; set;}
[Column("Amount")]
public decimal Amount {get; set;}
[Column("IdCustomer"), ForeignKey("Customer")]
public int IdCustomer { get; set; }
public virtual Customer Customer { get; set; }
}
“客户”是数据库中的现有对象,可以修改buit,也就是说这个视图也是订单。一旦用户准备好并进行了他/她的修改,我将ajax的序列化完整POCO对象作为JSON发送给我的控制器:
[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public ContentResult Save(Customer customer) {
//saving code
}
现在,收到的对象只是DbContex未跟踪的普通对象。这是从MVC3从视图JS发送的json自动序列化的,但我知道并确保它具有与它所代表的EF类相同的结构。
我想知道的是:是否可以保存整个对象及其相关对象的修改而不实际复制整个对象?
E.g。
现有客户有3个订单,1个被删除,另一个更改了数据并添加了新订单,所以我最终得到了:
因此,不是检索原始EF对象,然后检查每个命令以检查哪个更改,哪些被删除以及哪些实际上是新的,有一种方法可以将AJAX接收的这个POCO对象分配给DbContext,因此对象图实际上通过其跟踪器功能检查它并进行必要的更改。
我已经采用了几种方法:
首先:如果我只是将此对象附加到上下文然后将其DbEntry状态更改为仅修改,则只有Customer属性保留在数据库中,没有Order(s)对象是(是)持久化,因为它们被SaveChanges跟踪为未更改,除非我也手动修改它们的状态。
第二:在控制器中加载原始条目(使DbContext自动识别原始记录)并尝试使用Entry.CurrentValues.SetValues设置值只会设置Customer属性的值但是Orders集合中没有变化。
提前致谢。