流利的nHibernate - 使用复合键映射多个

时间:2012-01-16 12:08:40

标签: fluent-nhibernate nhibernate-mapping

我正在开发一个具有如下表结构的应用程序: (*表示键)

产品:
*产品ID
*品牌
ProductName

分类
*类别ID
类别名称

ProductCategories
*类别ID
* ProductID

产品的复合ID为ProductID&品牌

课程如下:

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- 我收到的错误如下:

  

必须与引用的主键(Product [ProductID,Brand])

具有相同的列数

3 个答案:

答案 0 :(得分:1)

如果产品具有ProductID&amp ;;的复合ID品牌然后在 ProductCategories 表中必须是ProductID,Brand和CategoryID的复合键。否则你会收到错误:

映射应该像 -

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

答案 1 :(得分:0)

那么你应该使用这个:

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

答案 2 :(得分:0)

您的代码几乎是正确的。问题是.ParentKeyColumn(...)和.ChildKeyColumn(...)需要Db列名。检查字符串NameOf.Property(p =&gt; p.ProductID)是否与列名相对应。另外,请尝试明确指定类别的类型。

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

希望这是问题所在。我在我的代码中使用完全相同的映射。