【发布时间】:2011-06-02 01:17:47
【问题描述】:
我对使用 Entity Framework 4,POCO 的多对多插入过程不是很熟悉。我有一个包含 3 个表的博客:帖子、评论和标签。一个帖子可以有很多标签,一个标签可以在很多帖子中。以下是 Post 和 Tag 模型:
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 表,还是只创建一个标签和一个 Posts 表以及两者之间的链接?
如何插入新的 帖子 并将标签设置到该帖子?只是newPost.Tags = Tags(其中标签是被选中的,我什至需要检查它们是否已经存在?),然后是_post.Add(newPost);之类的东西?
谢谢。
【问题讨论】:
-
嘿 Saxman,你在设置自定义初始化器吗? (DbDatabase.SetInitializer) 如果要更改模型,则应让 EF 也构建数据库,以便模型与数据库匹配。这可能是您的多对多无法正常工作的原因。如果您需要知道如何执行此操作,请告诉我!恕我直言,您真的不应该在域模型中定义查找实体。 EF 将为您完成这项工作并使其透明化。
-
嗨,Paul,我确实将 EF 设置为
DropCreateDatabaseIfModelChanges,我将再次尝试您在另一篇文章中使用的方法,看看多对多关系是否有效。谢谢。
标签: asp.net-mvc entity-framework-4 persistence many-to-many