Asp.net core 实体框架在重新获取后复制上下文中的对象

Asp.net core 实体框架在重新获取后复制上下文中的对象,asp.net-core,entity-framework-6,Asp.net Core,Entity Framework 6,我注意到实体框架使用.netcore1.1和ef6.1.3在内存上下文中复制子对象。有人能解释这种行为吗 例如,假设我有以下数据模型: public class Customer { public string Name { get; set; } public string SomeDataINeed { get; set; } public int CustomerId { get; set; } public virtual List<Order&g

我注意到实体框架使用.netcore1.1和ef6.1.3在内存上下文中复制子对象。有人能解释这种行为吗

例如,假设我有以下数据模型:

public class Customer 
{
    public string Name { get; set; }
    public string SomeDataINeed { get; set; }
    public int CustomerId { get; set; }
    public virtual List<Order> Orders { get; set; }
}

public class Order
{
    public string Description { get; set; }
    public double BundledDiscount {get; set; }
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public virtual Customer Cust { get; set; }
    public virtual List<LineItem> LineItems { get; set; }
}

public class LineItem
{
    public int OrderId { get; set; }
    public int LineItemId { get; set; }
    public double LineCost { get; set; }
    public virtual Order ParentOrder { get; set; }
}
第二次EF操作后的上下文:

context: {
   Order: {
       id: 1,
       LineItems: [{id: 33}] // I'm not trying to affect the state here.  LineItems are only here because they are in the body of the put
   }
}
context: {
    Customer: {
        Order: {
            id: 1,
            LineItems: [
                {id: 33},
                {id: 33} // The line item is duplicated here
                ] 
        }
    }
}

谢谢

它复制了它们,因为正如@Steve Greene所说,当您设置父实体的状态时,子实体不会被修改。就上下文而言,
PUT
中的行项目是新的实体,尽管它们有主键


您必须遍历每个子项并将其附加到上下文。通过这样做,如果它们有主键,则应将其设置为
Unchanged
状态;如果它们没有主键,则应将其设置为
Added

设置父项(顺序)的EntityState不会更改子项(行项)的状态。谢谢你,史蒂夫,我不是想影响孩子们的状态。我只是不想孩子们被复制,当我后来上升一个级别,并取得家长的客户。我在上面添加了另一个插图。米哈伊尔,谢谢你的解释。我注意到通过使用
\u context.Order.Update(Order)
我没有同样的问题。因此,我猜使用Update会级联更新/附件,而EntityState=Modified只会为特定实体设置它。
context: {
    Customer: {
        Order: {
            id: 1,
            LineItems: [
                {id: 33},
                {id: 33} // The line item is duplicated here
                ] 
        }
    }
}