Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架4.1创建重复的查找条目_Entity Framework_Entity Framework 4.1 - Fatal编程技术网

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

Entity framework 实体框架4.1创建重复的查找条目,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,我首先使用EF4.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

我首先使用EF4.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; }
 }
如果我有一些已经创建的现有产品类型(例如IDS2、3、4),并且我尝试将其中一个产品类型分配给一个新产品,它将创建该产品类型的副本

例如,如果我的最大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();
表达式expr=s=>s.ID==2;
ProductType t=DBContext.Set().Where(expr.First();
产品p=新产品();
p、 ProductType=t;
DBContext.SaveChanges();

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

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

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

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

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

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

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

为什么要从数据库加载
ProdutType
?您的实体上公开了外键,因此您需要:

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

为什么要从数据库加载
ProdutType
?您的实体上公开了外键,因此您需要:

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

我无法重现你的问题——它对我来说是正确的。尽管我没有看到您向上下文添加任何对象,但请参见下面Adi的答案。如果这个答案不正确,请发布更多的代码。你是对的。实际上,我试图简化它,却忽略了发布实际问题。我试图实现一个存储库模式,结果创建了两个不同的DBContext对象(一个用于产品,一个用于类型)。在我修好之后,它成功了!你能分享一下关于这个话题的一些研究吗?因为我目前正为同一个问题而挣扎,我想知道我做错了什么。我无法重现你的问题——它对我来说是正确的。尽管我没有看到您向上下文添加任何对象,但请参见下面Adi的答案。如果这个答案不正确,请发布更多的代码。你是对的。实际上,我试图简化它,却忽略了发布实际问题。我试图实现一个存储库模式,结果创建了两个不同的DBContext对象(一个用于产品,一个用于类型)。在我修好之后,它成功了!你可以分享一下关于这个主题的一些研究吗?因为我目前正在为同一个问题而挣扎,并且想了解我做错了什么。我实际上没有看到DBContext.AddObject(object)方法。我想知道它是否在4.1版本中被删除了?DBContext上没有AddObject方法,我实际上没有看到DBContext.AddObject(object)方法。我想知道它是否在4.1中被删除了?DbContexts上没有AddObject方法。我想我不必加载它,但它不是双向工作吗?我想我不必加载它,但它不是双向工作吗?