C# 在DbContext CodeFirst中使用分离的POCO对象更新实体框架

C# 在DbContext CodeFirst中使用分离的POCO对象更新实体框架,c#,asp.net-mvc,entity-framework,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("LastN

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

[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; }
}
现在,接收到的对象只是一个普通对象,没有被DbContex跟踪。这是从MVC3从视图JS发送的json自动序列化的,但我知道并确保它与它所表示的EF类具有相同的结构

我想知道的是:是否可以保存整个对象及其相关对象的修改,而不实际递归整个对象

例如

一位现有客户有3份订单,1份被删除,另一份更改了数据,并添加了一份新订单,因此我最终得到了:

  • Customer.Order1(未触及,现有)
  • Customer.Order2(已删除)
  • Customer.Order3(已修改,现有)
  • Customer.Order4(新的、不存在的但在数据库中)
  • 因此,与其检索原始EF对象,然后检查其每个订单,以检查哪些订单已更改,哪些订单已删除,哪些订单实际上是新订单,有一种方法可以将AJAX接收到的这个POCO对象分配给DbContext,这样对象图就可以通过其跟踪器功能来检查它,并进行必要的更改

    我已经采用了几种方法:

    首先:如果我只是将此对象附加到上下文,然后将其DbEntry状态更改为modified only,则客户属性将持久化到数据库中,不会持久化订单对象,因为除非我手动修改它们的状态,否则SaveChanges会将其跟踪为未更改

    第二步:在控制器中加载原始条目(使DbContext自动识别原始记录),并尝试使用条目设置值。CurrentValues.SetValues将仅设置客户属性的值,而不会设置订单集合中的更改


    提前感谢。

    您可以在此处投票支持改进对断开连接实体的支持:。还有一个链接指向一个名为GraphDiff的第三方工具,该工具可能适用于youThanks@Colin。最后我手动完成了它,因为我找不到这样做的方法。
    [HttpPost]
    [AcceptVerbs(HttpVerbs.Post)]
    public ContentResult Save(Customer customer) { 
        //saving code
    }