我不太熟悉使用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);
这样的东西?
感谢。
答案 0 :(得分:1)
我建议不要在数据库中维护多对多关系。
您应该考虑创建一个名为PostTag
或PostTagLookup
的查找表。
这将包含两列 - PostId
和TagId
。
实体框架奇妙地处理查找表,正如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)