2012-01-16 75 views
2

我正在開發具有表結構如下應用: (*表示鍵)功能NHibernate - 映射多對多的與複合鍵

產品:
*的ProductID
*品牌
產品名稱

分類
*類別ID
CategoryNam Ë

ProductCategories
*類別ID
*的ProductID

產品具有產品ID &品牌的複合ID

類如下:

public class Product 
{ 
    public int ProductID { get; set; } 
    public string Brand{ get; set; } 
    public string ProductName { get; set; } 

    public IEnumerable<Category> { get; set; } 
} 

public class Category 
{ 
    public int CategoryID { get; set; } 
    public string CategoryName { get; set; } 
} 

在我的產品映射,我有

HasManyToMany(x => x.Categories).Table("ProductCategories") 
    .ParentKeyColumn(NameOf<Product>.Property(p => p.ProductID)) 
    .ChildKeyColumn(NameOf<Category>.Property(p => p.CategoryID)) 
    .Cascade.All(); 

所以,基本上,我試圖根據ProductCategories表中的ProductID選擇類別... 這可能嗎?

However- 我發現了一個錯誤,如:

must have same number of columns as the referenced primary key (Product [ProductID, Brand])

+0

只是爲了檢查我假設你的意思ProductCategories當你寫上面ItemCategories? – Richard

+0

yes-重命名爲:-)謝謝 – Alex

回答

0

玉以及在這種情況下,你應該這樣做:

HasManyToMany<Category>(x => x.Categories) 
    .Table("ProductCategories") 
    .ParentKeyColumn("ProductID") 
    .ChildKeyColumn("CategoryID") 
+0

我得到了這個確切的錯誤:{「外鍵(FKCDD3036FAD8EF816:ProductCategories [ProductID]))必須與引用的主鍵(產品[ProductID,Brand])具有相同的列數」} – Alex

+0

您是否嘗試將品牌列添加到ProductCategories表中以適應複合ID? – Richard

+0

是的,我剛剛添加品牌專欄ProductCategories - 仍然是相同的問題 – Alex

0

你的代碼幾乎是正確的。問題是.ParentKeyColumn(...)和.ChildKeyColumn(...)需要Db列名稱。檢查字符串NameOf.Property(p => p.ProductID)是否與您的列名相對應。也請嘗試明確指定類別的類型。

HasManyToMany<Category>(x => x.Categories) 
    .Table("ProductCategories") // DB table name 
    .ParentKeyColumn("product_id") // column name 
    .ChildKeyColumn("category_id") // column name 

希望這是問題所在。我在代碼中使用完全相同的映射。

1

如果產品具有的ProductID的複合ID &品牌然後在ProductCategories表必須的ProductID,品牌和類別ID的組合鍵。否則U將得到一個錯誤:

和映射應該是喜歡 -

HasManyToMany<Category>(x => x.Categories) 
    .Table("ProductCategories") 
    .ParentKeyColumns.Add("product_id","Brand") 
    .ChildKeyColumn("category_id")