收集供应商
合同实体
谁得了c
产品收集
2相同的产品,但供应商不同
.
当我尝试将第二个产品添加到我的合同中时(相同的产品,但
不同的供应商
这一次)EF似乎忽略了它,没有将其添加到Contract.Products集合中。没有错误,但它不会添加错误。如何绕过此行为或以执行此操作的方式设置模型/逻辑?
// 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();
只需使用我之前已经获取的产品,并将其与UpdateContact一起传递
“无法定义两个对象之间的关系,因为它们附加到不同的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”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
“请注意,产品已附加/包含供应商,但来自另一个上下文(与产品上下文相同)。
我想这是关于产品和供应商的关系,或者可能是因为我使用了不同的上下文,我不知道,但我会进一步调查并发回。