2015-11-09 102 views
1

所以我有一個帖子和標籤類,應該是很多。但我無法獲得任何標籤顯示。如何爲帖子實現標籤?

Post類

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

} 

標籤類:

[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 Tag 
{ 
    public int TagID { get; set; } 
    public string Name { get; set; } 

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

而且部分是我的上下文類

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

異常的消息是什麼? – CodeNotFound

+0

各種不同的事情,因爲我不斷變化的東西。只是試圖找出我的邏輯是否正確 –

+0

如果您只是測試EF,請確保在發佈問題之前遇到問題SO – CodeNotFound

回答

0

不應該EF只是創建PostTags表和一切應該連接?

或者我必須擺脫modelBuilder代碼並創建我自己的第三個表格,但如果是這樣,我如何將標籤的ID傳遞給標籤?

EF足夠聰明,知道一個新表需要鏈接TagPost因爲你創建:

  • IList<Tag>Post
  • TagICollection<Post>

然後你就可以刪除你在OnModelCreating編寫的代碼和EF將創建一個新的錶鏈接TagPost

OnModelCreating刪除代碼的缺點是:

  • 你不知道提前EF將如何命名錶PostTagsTagPosts。想象一下,你需要創建一個與鏈接表相關的SQL視圖,知道表的名字會很酷。
  • 您不知道在組合鍵創建時組合鍵的順序是什麼,因爲在使用DbSet.Find方法時您需要使用相同的順序。這個方法需要按照它們在鏈接表上創建的順序來創建鍵。
0

我有我的項目的例子。我用表PostTag來連接Post與標籤。你也可以配置多對多的關係,先用代碼或者流利的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; } 
} 
+0

好,但在這個例子中。我如何指定帖子以使用標籤?當我創建一篇文章時,我如何讓Tag ID在Post PostTags集合中? –

+0

嗨,你可以從我的例子下載完整的源代碼https://github.com/EdinMahmutovic/Clean-Blog-MVC在管理區域你有郵政crud操作。這是我的測試項目,用於學習mvc ...登錄數據:([email protected],通過:Edin123!) –

相關問題