Как добавлять и повторно использовать объекты в отношениях «многие ко многим» в Entity Framework? - PullRequest
0 голосов
/ 03 июля 2010

Я работаю над проектом asp.net-mvc.

У меня есть таблица Items и таблица Tags.Также есть таблица ItemTags, состоящая из двух столбцов, настроенная как составной ключ, в которой хранятся идентификаторы из первых двух таблиц.

Сопоставленный с EntityFramework, эта последняя таблица позволяет перемещаться между таблицами.

Когда я добавляю новый тег для определенного элемента, который я использую:

db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(newTag);

Мой вопрос:Что произойдет, если тег уже добавлен в таблицу тегов, и у меня есть другой элемент, желающий повторно использовать этот тег?Что произойдет, если у меня есть НОВЫЙ элемент, который использует только теги, которые уже есть в таблице тегов?

Использует ли:

db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(newTag);

ОПЯТЬ, гарантирует, что у меня нет того же тега, добавленного дважды.Как мне «сделать» только связь между Тэгом и Предметом, если они оба уже есть в таблицах.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 июля 2010

Итак ... нашел ответ: (не знаю, есть ли лучшие способы сделать это ...) Это тот же метод Add (), который выполняет «добавить, если элемент новый» и «добавить, если элемент уже существует».

foreach (var incomingTag in tagList)
            {
                if (!String.IsNullOrEmpty(incomingTag))
                {
                    //this is where we check if there is a tag with the same name in the Tags table
                    var existingTag = db.Tags.Where(dbTag => dbTag.Name == incomingTag.ToLower()).FirstOrDefault();
                    if (existingTag == null)
                    {
                        //if there is no such Tag then we create a new one and add it
                        var newTag = new Tag { Name = incomingTag };
                        db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(newTag);
                        db.SaveChanges();
                    }
                    else
                    {
                        //if there is a tag with that name we "add" the old tag and by doing this we update the relationship
                        db.Items.Where(id => id.Id == newItem.Id).First().Tags.Add(existingTag);
                        db.SaveChanges();
                    }
                }
            }
0 голосов
/ 03 июля 2010

Entity Framework не гарантирует, что вы не добавите один и тот же тег дважды.Вы должны проверить себя.Entity Framework не имеет представления о том, что вы подразумеваете под «дублирующим тегом».

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

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