2013-08-29 86 views
0

使用實體框架我試圖在簡單的博客asp.net mvc 4應用程序中建立多對多的關係。我的型號如下:多對多插入邏輯

public class BlogPost 
    { 
     [Key] 
     public string Id { get; set; } 
     public DateTime DateCreated { get; set; } 

     [Required] 
     public string Title { get; set; } 
     public string Image { get; set; } 
     public string ThumbImage { get; set; } 
     public ICollection<BlogCategory> Categories { get; set; } 

     [AllowHtml] 
     public string Content { get; set; }   
    } 

    public class BlogCategory 
    { 
     [Key] 
     public string Name { get; set; } 

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

該博客類別不能作爲新的可能需要添加一個枚舉,所以需要一個集合。該類別很簡單,只是名稱,以及導航到具有給定類別的所有帖子的方式。問題是創建一個新的BlogPost。在理想的世界中,會發生以下事情。

private BlogPost post = new BlogPost 
    { 
     Title = "Blog Entry One", 
     Categories = new List<BlogCategory>() 
      { 
       new BlogCategory {Name = "Web"}, 
       new BlogCategory() {Name = "C#"} 
      }, 
     Content = 
      "Aliquam sem quam, posuere eget tellus in, porta semper dolor. Morbi aliquam placerat urna ut." 
    }; 

當名字由「網頁」一BlogCategory已經在數據庫中,然後引用它的上下文被保存。如果不創建新條目。

此刻EF會拋出一個錯誤,表明該密鑰已被使用。希望有人能幫助!

回答

2

您需要先檢索Category實體並重新使用或將它們附加到上下文並重用。否則,EF將嘗試在數據庫中爲新創建的實體創建新行,並且由於衝突鍵而失敗。

+0

是否可以在我的問題中允許創建新類別的功能,但保存時會檢查鍵是否爲新並插入。如果鍵存在引用數據庫中的當前一個? –