我正在开发一个具有如下表结构的应用程序: (*表示键)
产品:
*产品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])
具有相同的列数
答案 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
希望这是问题所在。我在我的代码中使用完全相同的映射。