如何为帖子实现标签?

时间:2015-11-09 04:30:55

标签: c# database entity-framework

所以我有一个Post和Tag类,应该很多。但是我无法获得任何标记来显示。

发布课程

public class Post
{
    public Post()
    {
        this.Tags = new List<Tag>();
    }

    public int PostID { get; set; }
    public string Title { get; set; }
    public DateTime DateTime { get; set; }
    public string Body { get; set; }

    public virtual IList<Tag> Tags { get; set; }

}

标记类:

public class Tag
{
    public int TagID { get; set; }
    public string Name { get; set; }

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

我的控制器的一部分

[HttpPost]
public ActionResult Create([Bind(Include = "Title,Body,Tags")] BlogInputModel input)
{
    if (ModelState.IsValid)
    {

        Post post = new Post
        {
            Title = input.Title,
            Body = input.Body,
            DateTime = DateTime.Now
        };
        post.Tags.Clear();
        foreach (string tag in input.Tags.Split(' '))
        {
            post.Tags.Add(GetTag(tag));
        }

        db.Posts.Add(post);
        db.SaveChanges();
        return RedirectToAction("Details", new { id = post.PostID });
    }
    return RedirectToAction("Index");
}

public ActionResult Details(int id)
{
    var post = db.Posts.Where(x => x.PostID == id).First();
    return View(post);
}

private Tag GetTag(string tagName)
{
    return db.Tags.Where(x => x.Name == tagName).FirstOrDefault() ?? new Tag { Name = tagName };
}

这是我的上下文类

public class BlogContext : DbContext
{
    public BlogContext() : base("BlogContext")
    {
    }

    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
           .HasMany(t => t.Tags)
           .WithMany(p => p.Posts)
           .Map(m => m.MapLeftKey("PostID")
                  .MapRightKey("TagID")
                  .ToTable("PostTags"));
    }
}

我试图以任何方式修复它并且无效。不应该EF只创建PostTags表,一切都应该连接?

或者我必须摆脱modelBuilder代码并创建我自己的第三个表,但如果是这样,我怎样才能将帖子的ID传递给标签?

2 个答案:

答案 0 :(得分:0)

  

EF不应该只创建PostTags表,一切都应该连接吗?

     

或者我必须摆脱modelBuilder代码并创建我自己的第三个表,但如果是这样,我怎样才能将帖子的ID传递给标签?

EF足够聪明,因为您创建了以下链接TagPost所需的新表格。

    IList<Tag>
  • Post {li> ICollection<Post> Tag

然后,您可以删除您在OnModelCreating中撰写的代码,EF会创建一个新表来链接TagPost

删除OnModelCreating中的代码的缺点是:

  • 您事先并不知道EF会如何为您的表格PostTagsTagPosts命名。想象一下,您需要创建一个与链接表相关的SQL视图,知道表的名称会很酷。
  • 您不知道创建组合键的顺序是什么,因为在使用DbSet.Find方法时您需要使用相同的顺序。此方法需要密钥的顺序与它们在链接表上的创建顺序相同。

答案 1 :(得分:0)

我的项目有例子。我使用表PostTag将Post与Tags连接起来。您还可以使用代码优先配置多对多关系,或者在自动生成连接表的情况下配置流畅的api。 See example

public class Post
{
    [Key]
    public int Id { get; set; }

    public string Title { get; set; }

    public DateTime DateTime { get; set; }

    public string Body { get; set; }

    public virtual ICollection<PostTag> PostTags { get; set; }
}

public class Tag
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(128)]
    [Index(IsUnique = true)]
    public String Name { get; set; }

    public virtual ICollection<PostTag> TagPosts { get; set; }
}

public class PostTag
{
    [Key]
    public int Id { get; set; }

    [Required]
    [Index("IX_PostTag", 1, IsUnique = true)]
    public int PostId { get; set; }

    [Required]
    [Index("IX_PostTag", 2, IsUnique = true)]
    public int TagId { get; set; }

    [ForeignKey("PostId")]
    public virtual Post Post { get; set; }

    [ForeignKey("TagId")]
    public virtual Tag Tag { get; set; }
}