Entity Framework - добавление одного и того же объекта дважды в отношениях «многие ко многим» - PullRequest
2 голосов
/ 25 августа 2011

Хорошо.Так вот в чем дело.У меня есть две сущности - «Продукт» и «Запчасти».Изделие состоит из частей.И части могут быть использованы в других продуктах.Отношение между этими сущностями много ко многим.И все это прекрасно работает.

Проблема в , что я не могу добавить одну и ту же деталь к одному и тому же продукту дважды.EF, кажется, заставляет все связанные объекты быть уникальными.Рассмотрим следующий код:

var product = context.Create<Product>();
var part = GetSomePart();

Console.WriteLine(product.Parts.Count); // will output 0

// Add a part
product.Parts.Add(part);
Console.WriteLine(product.Parts.Count); // will output 1

// Add the same part again
product.Parts.Add(part);
Console.WriteLine(product.Parts.Count); // will output 1!

Итак, я понял - избегайте дубликатов или чего-то еще.Но мне нужно, чтобы это было возможно.Есть ли способ сделать это (чтобы EF прекратил применять уникальные значения) без создания дополнительной таблицы?Или единственный способ решить эту проблему - вручную добавить промежуточную таблицу и обработать многие-ко-многим?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

В этом случае вам нужно будет создать еще одну таблицу с именем «ProductParts», которая будет иметь уникальный идентификационный ключ и которая может содержать ссылки как на продукт, так и на деталь, а также они могут быть множественными.

0 голосов
/ 25 августа 2011

Во втором операторе добавления он не будет добавлять другой объект, поскольку part уже находится в добавленном состоянии.Поэтому вам нужно создать новый объект с такими же свойствами, добавить его снова.

product.Parts.Add(new Part{someProperty=part.someProperty ... ect });

Если вы хотите уменьшить код, вы можете использовать Automapper (http://automapper.codeplex.com/) для копирования всех свойств,

 product.Parts.Add(Mapper.Map<Part,Part>(part));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...