如何实现帖子的标签
本文关键字:标签 实现 何实现 | 更新日期: 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足够聪明,知道需要一个新表来链接Tag
和Post
,因为您创建了:
Post
中的IList<Tag>
- CCD_ 5在CCD_
然后,您可以删除在OnModelCreating
中编写的代码,EF将创建一个新表来链接Tag
和Post
。
删除OnModelCreating
中的代码的缺点是:
- 您事先不知道EF将如何命名您的表
PostTags
或TagPosts
。想象一下,您需要创建一个与链接表相关的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; }
}