实体框架4多对多插入?

时间:2010-12-31 16:39:57

标签: asp.net-mvc entity-framework-4 persistence many-to-many

我不太熟悉使用Entity Framework 4,POCO的多对多插入过程。我有一个包含3个表的博客:帖子,评论和标签。 帖子可以包含多个标记标记可以包含多个帖子。以下是发布标记模型:

public class Tag
{
    public int Id { get; set; }

    [Required]
    [StringLength(25, ErrorMessage = "Tag name can't exceed 25 characters.")]
    public string Name { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }

    [Required]
    [StringLength(512, ErrorMessage = "Title can't exceed 512 characters")]
    public string Title { get; set; }

    [Required]
    [AllowHtml]
    public string Content { get; set; }

    public string FriendlyUrl { get; set; }
    public DateTime PostedDate { get; set; }
    public bool IsActive { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

现在当我添加新帖子时,我不确定什么是正确的方法。我想我将有一个文本框,我可以为该帖子选择多个标签(这部分已经完成),在我的控制器中,我将检查标签是否已经存在,如果没有,那么我将插入新标签。但我甚至不确定基于我为EF创建的模型,他们会创建一个PostsTags表,还是只创建一个Tags和一个Posts表以及两者之间的链接?

如何插入新的帖子并将标记设置为该帖子?它只是newPost.Tags = Tags(标签是被选中的那个,我甚至需要检查它们是否已经存在?),然后像_post.Add(newPost);这样的东西?

感谢。

3 个答案:

答案 0 :(得分:1)

我建议不要在数据库中维护多对多关系。

您应该考虑创建一个名为PostTagPostTagLookup的查找表。

这将包含两列 - PostIdTagId

实体框架奇妙地处理查找表,正如his answer中@Moyo所提到的那样:

  

实体框架会将映射表转换为双方的实体集合,表本身将基本消失。

答案 1 :(得分:1)

我认为这就是你想要的。

var tag = context.Tags.FirstOrDefault(x=>x.Name == name);
if (tag == null)
    context.Tags.AddObject(tag = new Tag { Name = name });
if (!post.Tags.Contains(tag))
    post.Tags.Add(tag);

新年快乐编码))

答案 2 :(得分:0)