2011-05-03 32 views
3

我有一个关于MVC3和EF中的多对多关系的基本问题。 在我的数据库中,我有文章和标签(多对多),通过TagArticle表连接到两个表的外键。 在我的MVC项目中,我创建了具有来自文章和标签的属性的viewmodel,我想在一个视图中使用它,允许用户创建文章并为其选择标签。 如何对该场景进行插入操作? 感谢您的帮助。使用MVC3中的实体框架插入到许多相关的表格和视图模型

回答

0

像这样的事情应该“只是工作”:

// 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(); 
0

如果你只需要创建新的文章中,你可以使用这种方法:

  • 在你的表格,你必须张贴的文章,要么名单分配给物品的标记ID或标记名称
  • 然后,您可以将新的Article添加到上下文
  • 如果您发布ID,您必须为每个标记a创建虚拟对象第二附加到上下文
  • 如果你发布你必须加载标签对象从数据库中每个名字(你需要它的ID)
  • 最后的名字,你可以填写TagsArticle加入上下文(它必须是作为用于任何连接或装载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

相关问题