无法将同一实体(具有不同的相关属性实体)插入到另一个实体



我有一个实体产品,他有一个供应商集合(也是一个实体(,我有一名合同实体他有一组产品。一份合同可以有多个产品,甚至有两个相同的产品,但供应商不同

当我试图将第二个产品添加到我的合同中时(这次是同一个产品,但不同的供应商(,EF似乎忽略了它,没有将它添加到合同中。产品集合。没有错误,但它没有添加它。我如何绕过这种行为或以可以执行此操作的方式设置我的模型/逻辑?

代码:

// THIS CONTEXT RESIDES IN A USING BLOCK
// THE updateContracts.Products ARE COMING FROM ANOTHER CONTEXT and we are receiving this entity as a parameter
// fetching the contract we are updating from database
Contract contractFromDB = ctx.Contracts.Include(s)(...)Where(p => p.ID == updateContract.ID).FirstOrDefault();
// list to populate the products we have added
List<Product> productsToAddToDBContract = new List<Product>();
foreach (Entity.Product product in updateContract.Products)
{
if (!contractFromDB.Products.Any(prod => prod.ProductName == product.ProductName))
{
// tried detaching it but didn't work
//ctx.Entry(product).State = EntityState.Detached;
productsToAddToDBContract.Add(product);
}
}
foreach (Product product in productsToAddToDBContract)
{
// get these from DB and add those to DB contract products
Product productToAdd = ctx.Products.Include(p=> p.Suppliers).Where(prod=> prod.ProductName == product.ProductName).FirstOrDefault();
if (productToAdd != null)
{
// HERE IS WHERE EF DOESN'T ADD THE SECOND PRODUCT (WHICH IS THE SAME BUT FROM ANOTHER SUPPLIER)
contractFromDB.Products.Add(productToAdd);
}
}

非常感谢。

编辑:我试图删除从数据库中提取产品的行

Product productToAdd = ctx.Products.Include(...).Where(...).FirstOrDefault();

只需使用我之前已经获取的产品,并与updateContract一起传递。Products,我得到"无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。">

所以我去附加了这个迭代的产品:

foreach (Product product in productsToAddToDBContract)
{
// removed this line:
// Entity.Product productToAdd = ctx.Products.Include(p=> p.Suppliers).Where(prod=> prod.ProductName == product.ProductName).FirstOrDefault();
// and added this one
ctx.Products.Attach(product);
contractFromDB.Products.Add(product);
}

然后我收到了">附加类型为"Supplier"的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用"Attach"方法或将实体的状态设置为"Unchanged"或"Modified"时可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值s.在这种情况下,请使用"Add"方法或"Added"实体状态来跟踪图形,然后根据情况将非新实体的状态设置为"Unchanged"或"Modified">"请注意,该产品已经有一个供应商,但来自另一个上下文(与该产品的上下文相同(。

我认为这与产品和供应商的关系有关,或者可能因为我使用了不同的上下文,我不知道,但我会进一步调查并发布。

当然,您可以随时以任何方式做出贡献:(

问题是我的模型结构,我无法详细说明它是如何实现的,但相关实体关系没有正确设置,我创建了一个新的实体,其中包含ProductId SupplierId和其他实体,并对其进行了调整,直到我得到我想要的。我之所以出现这些错误(如上所述(,是因为我在执行操作时没有附加所有相关实体,当我将适当的相关实体引用到我的产品时,错误就消失了…:(

希望这能帮助到别人,并原谅我有点不清楚的解决方案,我正在进行这个项目,时间是一个问题,因为知道公司想要一个有效的解决方案而不是一个干净的解决方案所以我没有把一切都搞砸。。。

谨致问候!

最新更新