所以我有一个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传递给标签?
答案 0 :(得分:0)
EF不应该只创建PostTags表,一切都应该连接吗?
或者我必须摆脱modelBuilder代码并创建我自己的第三个表,但如果是这样,我怎样才能将帖子的ID传递给标签?
EF足够聪明,因为您创建了以下链接Tag
和Post
所需的新表格。
IList<Tag>
中Post
{li> ICollection<Post>
Tag
。然后,您可以删除您在OnModelCreating
中撰写的代码,EF会创建一个新表来链接Tag
和Post
。
删除OnModelCreating
中的代码的缺点是:
PostTags
或TagPosts
命名。想象一下,您需要创建一个与链接表相关的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; }
}