在DbContext Code First中使用分离的POCO对象更新实体框架

时间:2014-02-04 00:43:07

标签: c# asp.net-mvc entity-framework

所以我有一个视图,我修改了一个“复杂”对象,意味着它有其他对象的集合,你知道通常的事情:

[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个被删除,另一个更改了数据并添加了新订单,所以我最终得到了:

  1. Customer.Order1(未触及,现有)
  2. Customer.Order2(已删除)
  3. Customer.Order3(已修改,现有)
  4. Customer.Order4(新的,尚未存在于db中)
  5. 因此,不是检索原始EF对象,然后检查每个命令以检查哪个更改,哪些被删除以及哪些实际上是新的,有一种方法可以将AJAX接收的这个POCO对象分配给DbContext,因此对象图实际上通过其跟踪器功能检查它并进行必要的更改。

    我已经采用了几种方法:

    首先:如果我只是将此对象附加到上下文然后将其DbEntry状态更改为仅修改,则只有Customer属性保留在数据库中,没有Order(s)对象是(是)持久化,因为它们被SaveChanges跟踪为未更改,除非我也手动修改它们的状态。

    第二:在控制器中加载原始条目(使DbContext自动识别原始记录)并尝试使用Entry.CurrentValues.SetValues设置值只会设置Customer属性的值但是Orders集合中没有变化。

    提前致谢。

0 个答案:

没有答案