无法将相同的实体(具有不同的相关 properties-entity)插入到另一个实体
Can't insert same Entity (with different related properties-entity) to another Entity
我有一个 实体产品,它有一个 collection 的供应商(这也是一个实体)并且我有合同实体,拥有 c产品 系列。一份合同可以有多种产品,甚至 2 种相同的产品但供应商不同。
当我尝试将第二个产品添加到我的合同中时(相同的产品,但这次 不同的供应商 )EF 似乎忽略了它并且没有将其添加到 Contract.Products collection。没有错误,但它没有添加它。我如何绕过此行为或以我可以执行此操作的方式设置我的 model/logic?
代码:
// 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();
并且只使用我之前已经获取的产品并通过更新Contract.Products,我得到了"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."
所以我去附上了这次迭代的产品:
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' 如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到 database-generated key values. 在这种情况下,使用 'Add' 方法或 'Added' 实体状态来跟踪图形,然后将 non-new 实体的状态设置为 'Unchanged' 或 'Modified' 视情况而定。" 请注意,该产品已有供应商 attached/included,但来自另一个上下文(与产品的上下文相同)。
我认为这与产品和供应商的关系有关,或者可能因为我使用的是不同的上下文,我不知道,但我会进一步调查并 post 返回。
当然可以以任何方式做出贡献:)
问题出在我的模型结构上,我无法详细说明它是怎么回事,但相关实体关系设置不正确,我创建了一个包含 ProductId-SupplierId 和其他实体的新实体,对其进行调整直到我得到了我想要的。我收到这些错误(如上所述)的原因是因为我在执行操作时没有附加所有相关实体,当我将适当的相关实体引用到我的产品时,错误消失了......:)
希望这对某人有所帮助并原谅我不太清楚的解决方案,我正处于这个项目的中间,时间是个问题,因为知道公司想要一个可行的解决方案而不是一个干净的解决方案所以我没有一切都下来了...
亲切的问候!
我有一个 实体产品,它有一个 collection 的供应商(这也是一个实体)并且我有合同实体,拥有 c产品 系列。一份合同可以有多种产品,甚至 2 种相同的产品但供应商不同。
当我尝试将第二个产品添加到我的合同中时(相同的产品,但这次 不同的供应商 )EF 似乎忽略了它并且没有将其添加到 Contract.Products collection。没有错误,但它没有添加它。我如何绕过此行为或以我可以执行此操作的方式设置我的 model/logic?
代码:
// 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();
并且只使用我之前已经获取的产品并通过更新Contract.Products,我得到了"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."
所以我去附上了这次迭代的产品:
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' 如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到 database-generated key values. 在这种情况下,使用 'Add' 方法或 'Added' 实体状态来跟踪图形,然后将 non-new 实体的状态设置为 'Unchanged' 或 'Modified' 视情况而定。" 请注意,该产品已有供应商 attached/included,但来自另一个上下文(与产品的上下文相同)。
我认为这与产品和供应商的关系有关,或者可能因为我使用的是不同的上下文,我不知道,但我会进一步调查并 post 返回。
当然可以以任何方式做出贡献:)
问题出在我的模型结构上,我无法详细说明它是怎么回事,但相关实体关系设置不正确,我创建了一个包含 ProductId-SupplierId 和其他实体的新实体,对其进行调整直到我得到了我想要的。我收到这些错误(如上所述)的原因是因为我在执行操作时没有附加所有相关实体,当我将适当的相关实体引用到我的产品时,错误消失了......:)
希望这对某人有所帮助并原谅我不太清楚的解决方案,我正处于这个项目的中间,时间是个问题,因为知道公司想要一个可行的解决方案而不是一个干净的解决方案所以我没有一切都下来了...
亲切的问候!