Вставить много-много связанных таблиц, используя структуру сущностей в MVC3 и viewmodel - PullRequest
3 голосов
/ 03 мая 2011

У меня довольно простой вопрос об отношениях «многие ко многим» в MVC3 и EF.В моей базе данных есть статьи и теги (многие ко многим), связанные таблицей TagArticle с внешними ключами для обеих таблиц.В моем проекте MVC я создал viewmodel с атрибутами из статьи и тега, я хочу использовать его в одном представлении, которое позволяет пользователю создавать статью и выбирать для нее теги.Как сделать операцию вставки в этот сценарий?Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

Если вам просто нужно создать новую статью, вы можете использовать этот подход:

  • В вашей форме вы должны опубликовать статью и либо список идентификаторов тегов, либо имена тегов, присвоенные статье
  • Затем вы можете добавить новый Article в контекст
  • Если вы публикуете идентификаторы, вы должны создать фиктивный объект для каждого тега и прикрепить его к контексту
  • Если вы публикуете имя, вы должны загрузить объект тегадля каждого имени из базы данных (вам нужен его идентификатор)
  • Наконец, вы можете заполнить Tags новым Article, добавленным в контекст (это должен быть тот же контекст, который использовался для присоединения или загрузки Tags)

Так что должно быть что-то вроде:

context.Articles.AddObject(article);
int[] ids = GetIdsFromRequest();
foreach(var tag in ids.Select(id => new Tag { Id = id }))
{
    context.Tags.Attach(tag);
    article.Tags.Add(tag);
}

context.SaveChanges();

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

0 голосов
/ 03 мая 2011

Примерно так должно "просто работать":

// get tags by name (tagNames is array of string)
var tags = (from t in db.Tags where tagNames.Contains(t.Name) select t).ToList();

var article = CreateArticleFromPostedForm(...);

var newTags = from tagName in tagNames.Except(tags.Select(t => t.Name)) select new Tag(tagName);

// Tags collection should be initialized properly when creating the article
// NOTE: probably better to add a constructor for Article that accepts a list of Tags
article.Tags.AddRange(tags.Concat(newTags));

db.SaveChanges();
...