如何实现帖子的标签

本文关键字:标签 实现 何实现 | 更新日期: 2023-09-27 18:21:19

所以我有一个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传递给标签?

如何实现帖子的标签

EF不应该只创建PostTags表,所有东西都应该连接起来吗?

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

EF足够聪明,知道需要一个新表来链接TagPost,因为您创建了:

  • Post中的IList<Tag>
  • CCD_ 5在CCD_

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

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

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

我的项目中有一个例子。我使用表PostTag将Post与Tags连接起来。您还可以使用代码优先或fluent api配置多对多关系,其中连接表将自动生成。参见示例

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; }
}