c# - Entity Framework 6.1 Code First MySql 实体跟踪在上下文中持续存在

标签 c# mysql entity-framework

我在 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/

相关文章:

php - 如何使用 javascript 从数据库中获取当前的伊斯兰日期记录

mysql - 在 Laravel 中将 JSON 对象保存到 MySQL 数据库中

c# - 使用多对多关系添加对象 Entity Framework

c# - 如何在 C# 中使用 using 语句进行错误处理

c# - 如何在 ViewModel 中设置从模型列表中获取和设置值的属性?

c# - 如何确定在 C# 中发送电子邮件的时区

c# - 在字符串中使用数组

mysql - 为什么 mysql 中的日期会出现此错误消息?

c# - 如何根据日期列获取最新信息并返回 BuildMetrics 类型的对象?

silverlight - 如何在 Silverlight 4 应用程序中禁用验证?