У меня есть Продукт сущности , у которого есть коллекция поставщиков (которая также является сущностью), и у меня есть Контрактная сущность , у которой есть AC подбор продуктов .Контракт может иметь несколько продуктов, даже 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();
и просто использовать продукт, который я уже получил до и передать с 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);
}
затем я получил '' Не удалось подключить объект типа «Поставщик», поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Это может происходить при использовании метода «Присоединить» или установке состояния объектав значение «Неизменен» или «Изменен», если какие-либо объекты в графе имеют конфликтующие ключевые значения. Это может быть потому, что некоторые объекты являются новыми и еще не получили сгенерированные базой данныхключевые значения.В этом случае используйте метод «Добавить» или состояние объекта «Добавлено» для отслеживания графика, а затем установите для состояния не новых объектов значение «Неизмененный» или «Измененный», в зависимости от ситуации."Обратите внимание, что продукт ужек нему подключен / включен поставщик, но из другого контекста (такого же, как контекст продукта).
Это касается отношения продукта и поставщика, я думаю, или, может быть, потому что я использую разные контексты, я неНе знаю, но я продолжу расследование и отправлю ответ.
Не стесняйтесь вносить свой вклад любым способом, конечно:)