Asp.net core 实体框架在重新获取后复制上下文中的对象
我注意到实体框架使用.netcore1.1和ef6.1.3在内存上下文中复制子对象。有人能解释这种行为吗 例如,假设我有以下数据模型: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
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
]
}
}
}