Нарушение первичного ключа при добавлении взаимосвязи из множества связанных таблиц в инфраструктуру сущностей MVC 3 - PullRequest
6 голосов
/ 19 ноября 2011

Я прочитал множество вопросов здесь, которые на первый взгляд кажутся похожими, но кажутся совсем не такими.Огромные извинения, если на этот вопрос есть ответ, но, как я уже сказал, я прочитал грузы и не могу найти ответ.

Я использую Entity Framework и MVC 3. Я пытаюсь добавить теги к продуктам.в моей структуре сущностей, которая имеет отношение многие ко многим и таблицу, связывающую их просто двумя ключами в таблице ссылок, поэтому EF объединяет теги в свойство Product.Таблицы настраиваются следующим образом:

Product: ProductID [int, первичный ключ], имя и т. Д.

Метки: TagName [строка, первичный ключ]

ProductTags:ProductID, TagName

Таким образом, чтобы получить доступ к ProductTags, я могу просто использовать product.Tags

Это мой код:

dbProduct.Tags.Clear();
foreach (var tag in productModel.Tags)
{
    Data.Tag dbTag = new Data.Tag();
    dbTag.TagName = tag;
    dbProduct.Tags.Add(dbTag);
}

dbProduct является сущностью Product, а Data являетсяПространство имен.productModel.Tags - это List<string>

Когда я SaveChanges() получаю следующее исключение:

"Нарушение ограничения PRIMARY KEY 'PK_Tags_1'. Невозможно вставить дубликат ключа в объект'dbo.Tags'. \ r \ nОпределение прервано. "

Итак, что меня по-настоящему интересует: почему он пытается что-то добавить в dbo.Tags?Мне кажется, это следует просто добавить в теги продукта, а не теги.Я не упоминаю теги где-либо еще в этом методе, и поэтому ни в коем случае не пытаюсь добавлять что-либо непосредственно в таблицу тегов.Такое чувство, что у меня может быть что-то неправильно настроено в EF, но я не могу думать, что именно, и это было сгенерировано из базы данных.

Снова извините, если это ослепительно очевидно, я чувствую себя довольно глупо.Любая помощь очень ценится.

1 Ответ

13 голосов
/ 19 ноября 2011

Проблема в том, что вы создаете новый объект Tag с существующим первичным ключом.Когда вызывается SaveChanges(), EF обнаруживает изменения объектов, которые уже отслеживаются, и добавляются новые объекты.Поскольку ваш новый Tag объект не отслеживался EF, он пытается вставить его.

Вам необходимо явно указать EF, что созданный тег является существующим.Для этого вам необходимо присоединить it.

dbProduct.Tags.Clear();
foreach (var tag in productModel.Tags)
{
    Data.Tag dbTag = new Data.Tag();
    dbTag.TagName = tag;

    db.TagSet.Attach(dbTag);

    dbProduct.Tags.Add(dbTag);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...