实体框架 4.1 创建重复的查找条目

Posted

技术标签:

【中文标题】实体框架 4.1 创建重复的查找条目【英文标题】:Entity Framework 4.1 Creating Duplicate Lookup Entries 【发布时间】:2011-04-02 00:18:09 【问题描述】:

我首先使用的是 EF 4.1 代码。我有两个班级:

 public class Product 
      public int ID  get; set; 
      public string Name  get; set; 
      public int ProductTypeID  get; set; 
      public virtual ProductType ProductType  get; set; 
 

 public class ProductType 
      public int ID  get; set; 
      public string Name  get; set; 
 

如果我已经创建了一些现有的 ProductTypes(例如 ID 2、3、4),并且我尝试将这些 ProductTypes 之一分配给新产品,它将创建 Product 类型的副本。

例如,如果我最大的 ProductTypeID 是 4,我运行以下代码,会产生重复:

 Expression<Func<ProductType, bool>> expr = s => s.ID == 2;
 ProductType t = DBContext.Set<ProductType>().Where(expr).First();
 Product p = new Product();
 p.ProductType = t;
 DBContext.SaveChanges();

这实际上会在“ProductType”表中创建一个新行。新的 ProductType 将与 ID 为 2 的产品类型相同,但新的 ID 为 5。我要做的就是将 ID=2 的类型与我的新产品相关联。知道我做错了什么吗?

【问题讨论】:

我无法重现您的问题——它对我来说可以正常工作。即使我没有看到您将任何对象添加到上下文中,请参阅下面的 Adi 回答。如果该答案不正确,请发布更多代码。 你是对的。我实际上试图简化它,而忽略了发布实际问题。我试图实现存储库模式并最终创建了两个不同的 DBContext 对象(一个用于产品,一个用于类型)。在我修复它之后,它起作用了! 您能否分享一些关于这个主题的研究,因为我目前正在努力解决同样的问题,并且想了解我做错了什么。 【参考方案1】:

这实际上是使用 EF 的常见错误。

您需要将新产品添加到 DBContext:

Product p = new Product();
p.ProductType = t;
DBContext.AddObject(p); //here
DBContext.SaveChanges();

【讨论】:

我实际上没有看到 DBContext.AddObject(object) 方法。我想知道它是否在 4.1 中被删除了? DbContext 上没有 AddObject 方法【参考方案2】:

为什么要从数据库中加载ProdutType?您的实体上公开了外键,所以这就是您所需要的:

Product p = new Product();
p.ProductTypeId = 2;
DBContext.Products.Add(p);
DBContext.SaveChanges();

【讨论】:

我想我不必加载它,但它不应该双向工作吗?

以上是关于实体框架 4.1 创建重复的查找条目的主要内容,如果未能解决你的问题,请参考以下文章

实体框架在多对多关系中重复条目

使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目

实体框架 4.1 代码优先外键 ID

JPA 与同一实体的两个单向 @OneToMany 关系导致重复条目

MySqlException:键“aspnetusers.PRIMARY”的重复条目

如何允许 CoreData 实体列表中的重复条目