2012-12-04 51 views
3

我一直在玩實體核心類如的DbContext,並出現以下錯誤試圖保存對象:淨實體多對多的SaveChanges

同時節省了不公開外鍵的實體時出錯 屬性爲他們的關係。 EntityEntries屬性 將返回null,因爲無法將單個實體標識爲異常的源 。通過在您的實體類型中公開外鍵屬性,可以更輕鬆地處理異常,同時保存 。有關詳細信息,請參閱 InnerException。

我基本上我的ERD用多對多如

comment comment_category category 
id  comment_id   id 
text  category_id  name 

的comment_category表是一個組合主鍵映射意見類別

檢索數據是好的,但是當我嘗試以節省它抱怨的關係

我最感興趣的模型看起來像

public class Comment 
{ 
    [Key] 
    public int Comment_Id {get;set;} 
    public string Text {get;set;} 
    public virtual List<Category> Categories { get; set; } 
} 
public class Comment_Category 
{ 
    [Key, Column(Order = 0)] 
    public int Comment_Id {get;set;} 
    [Key, Column(Order = 2)] 
    public int Factor_Id {get;set;} 
} 

而且它的使用,如

#Comments have Categories with Category Id filled and Comment Id null 
List<Comment> comments = getComments(); 
using(dbContext db = new dbContext()) 
{ 
    foreach(Comment c in comments) 
    db.Comments.add(c); 
    db.SaveChanges(); 
} 

我不完全知道爲什麼它可以很容易找到它不夠好,但有一個硬​​節省時間。我能想到的唯一區別是我保存的評論是新的,所以他們只有評論類別沒有評論ID只是類別ID。我認爲它會保存評論並將comment_id分配給comment_category表,因此我不知道如何完成此操作

我意識到也許我的方法是錯誤的,因爲我使用映射表而不是實際實體的類別,所以如果有人知道更好的方式,請分享。

謝謝!

+0

有什麼的InnerException? – SLaks

回答

0

最簡單的方法是在沒有很多儀式的情況下做到這一點,也可以收集關於類別的評論,並讓實體框架推斷M:M關係。它會自動創建一個具有主鍵和外鍵的CategoryComments表。

所以對於模型中,我們只是有:

public class Comment 
{ 
    [Key] 
    public int Comment_Id { get; set; } 
    public string Text { get; set; } 
    public virtual List<Category> Categories { get; set; } 
} 

public class Category 
{ 
    [Key] 
    public int Category_Id { get; set; } 
    public string Name { get; set; } 
    public virtual List<Comment> Comments { get; set; } 
} 

用法是這樣的:

public class MyDbContext : DbContext 
{ 
    public DbSet<Comment> Comments { get; set; } 
    public DbSet<Category> Categories { get; set; } 
} 

using (var db = new MyDbContext()) 
{ 
    var blue = new Category { Name = "Blue" }; 
    var red = new Category { Name = "Red" }; 
    db.Categories.Add(blue); 
    db.Categories.Add(red); 

    db.Comments.Add(new Comment 
    { 
     Text = "Hi", 
     Categories = new List<Category> { blue } 
    }); 

    db.SaveChanges(); 
} 
+0

這種方法看起來像是預期的,而在新Schema的情況下則完全有意義。在我的情況下,我有一個現有的架構,我沒有控制權,所以我有表映射和定義一個特定的方式。 – user1876229

+0

@ user1876229出於好奇,您是否嘗試過使用[Entity Framework Power Tools](http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d)並進行反向工程以查看生成的內容?我發現它可以成爲一個有用的工具來看EF如何認爲事情應該是怎樣的例子。當然永遠不會是完美的。 – eddiegroves

+0

我會看看謝謝! – user1876229