使用MVC3中的实体框架插入到许多相关的表格和视图模型
问题描述:
我有一个关于MVC3和EF中的多对多关系的基本问题。 在我的数据库中,我有文章和标签(多对多),通过TagArticle表连接到两个表的外键。 在我的MVC项目中,我创建了具有来自文章和标签的属性的viewmodel,我想在一个视图中使用它,允许用户创建文章并为其选择标签。 如何对该场景进行插入操作? 感谢您的帮助。使用MVC3中的实体框架插入到许多相关的表格和视图模型
答
像这样的事情应该“只是工作”:
// 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();
答
如果你只需要创建新的文章中,你可以使用这种方法:
- 在你的表格,你必须张贴的文章,要么名单分配给物品的标记ID或标记名称
- 然后,您可以将新的
Article
添加到上下文 - 如果您发布ID,您必须为每个标记a创建虚拟对象第二附加到上下文
- 如果你发布你必须加载标签对象从数据库中每个名字(你需要它的ID)
- 最后的名字,你可以填写
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();
它应该工作,因为你知道,所有关系到标签是新的,但一旦你婉t修改文章并更改分配的标签,您将需要more complicated approach。