我在 DbContext 保存重复对象时遇到了一个奇怪的问题。我有一个类似于以下内容的对象图:
public class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public ICollection<Order> Orders {get;set;}
}
public class Order
{
public int Id {get;set;}
public DateTime OrderDate {get;set;}
public ICollection<Product> Products {get;set;}
}
public class Product
{
public int Id {get;set;}
public string Name {get;set;}
public ICollection<Orders> Orders {get;set;}
}
public class MyContext:DbContext
{
public DbSet<Customer> Customers {get;set;}
public DbSet<Order> Orders {get;set;}
public DbSet<Product> Products {get;set;}
}
这当然是一个人为的示例,但如果我想保存两个新客户。我使用 DbContext.Customers.Add() 添加它们。客户已完全填写订单和产品。它可以很好地保存所有数据。但是,如果添加第二个客户,即使使用全新的 DbContext 实例,它也会再次添加原始客户。我仍然有对原始客户的引用,但我没有将其添加到新的上下文实例中。然而,DbContext.SaveChanges 将保存两个客户,即第二次保存原始客户和新客户。这将成倍增加我保存的记录数量。这适用于整个图表。订单和产品也会重复。
如果我在保存后手动分离对象,则不会保存重复项。由于我要立即添加整个客户,因此我必须循环遍历所有子实体并分离它们。如果我只分离客户,它仍然会复制以前的订单和产品。如果我关闭更改跟踪,这种情况似乎也会发生!
有什么想法吗?
最佳答案
按照建议,我尝试在一个小应用程序中复制此内容,以便更容易共享。但我无法让它发生。我检查了代码 20 次,终于注意到了一些事情。
假设我在层次结构的顶部添加了一个新类 Company。所以每个公司都有很多客户。如果我添加一个公司,保存它,但保留引用,然后在添加它们之前使用该引用分配给每个“客户”的导航属性,它将保存重复项。即使每次保存(公司、客户 1、客户 2 等)在 using 语句中都有一个全新的 DbContext。
我想现在这个故事的寓意是不要在这种情况下分配导航属性。相反,添加 Id 列并使用 Id 值。
Here's my example这重现了我正在谈论的问题。也许这是您“只是不做”的事情,但我不知道这会导致重复。
关于c# - Entity Framework 6.1 Code First MySql 实体跟踪在上下文中持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34385574/