Невозможно вставить один и тот же объект (с другим связанным объектом-сущностью) в другой объект - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть Продукт сущности , у которого есть коллекция поставщиков (которая также является сущностью), и у меня есть Контрактная сущность , у которой есть 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);
}

затем я получил '' Не удалось подключить объект типа «Поставщик», поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Это может происходить при использовании метода «Присоединить» или установке состояния объектав значение «Неизменен» или «Изменен», если какие-либо объекты в графе имеют конфликтующие ключевые значения. Это может быть потому, что некоторые объекты являются новыми и еще не получили сгенерированные базой данныхключевые значения.В этом случае используйте метод «Добавить» или состояние объекта «Добавлено» для отслеживания графика, а затем установите для состояния не новых объектов значение «Неизмененный» или «Измененный», в зависимости от ситуации."Обратите внимание, что продукт ужек нему подключен / включен поставщик, но из другого контекста (такого же, как контекст продукта).

Это касается отношения продукта и поставщика, я думаю, или, может быть, потому что я использую разные контексты, я неНе знаю, но я продолжу расследование и отправлю ответ.

Не стесняйтесь вносить свой вклад любым способом, конечно:)

1 Ответ

0 голосов
/ 03 декабря 2018

Проблема заключалась в моей структуре модели, я не могу подробно описать, как это было, но отношение связанных сущностей не было правильно настроено, я создал новую сущность, которая содержит ProductId-SupplierId и другие, настраивая ее до тех пор, пока не получу то, чтоя хотел.Причина, по которой я получил эти ошибки (указано выше), заключалась в том, что я не прикреплял все связанные сущности при выполнении действий, когда я ссылался на соответствующие связанные сущности на свой продукт, ошибки исчезали ...:)

Надеюсь, что это кому-то поможет и простит меня за несколько неясное решение, я нахожусь в центре этого проекта, и время - это проблема, потому что знаю, что компания хочет рабочее решение, а не чистое, поэтому я не все упустил...

С уважением!

...