我是Fluent-NHibernate的新手。 我的问题是想要在两个实体之间建立一对多的关系。 产品可以具有多个(唯一)修订,并且特定修订仅属于一个产品。 因此,例如,Product1具有修订版“a”和修订版“b”,但不能具有两个修订版“a”。这就是我的类定义:
public class Product
{
public virtual int ID {get; private set;}
public IList<ProductRevision> revisions { get; set; }
}
public class ProductRevision
{
public virtual int ID {get; private set;}
public Product isRevisionOf { get; set; }
public virtual string revision { get; set; }
}
这是我的映射
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.ID).Column("ProductNo");
HasMany(x => x.revisions).Cascade.All();
}
}
public class ProductRevisionMap : ClassMap<ProductRevision>
{
public ProductDefinitionFormationMap()
{
Id(x => x.ID);
References(x => x.isRevisionOf).UniqueKey("Product_Revision").Not.Nullable();
Map(x => x.revision).UniqueKey("Product_Revision").Not.Nullable();
}
}
我现在得到的是ProductRevision表中的冗余列“Product_Id”。我是通过使用hasMany()和references()定义两侧的关系而得到错误的。 通常我不会定义References(...)映射,但是我需要它用于uniquekey约束,不是吗?
谢谢, 埃里克
答案 0 :(得分:0)
这是双向的一对多关系,映射可能如下所示:
public ProductMap()
{
Id(x => x.ID).Column("ProductNo");
HasMany(x => x.revisions)
.KeyColumn("ProductId") // the name of the FK column in ProductRevision table
.Inverse() // bi-directional relation
.Cascade.All();
}
public ProductRevisionMap()
{
Id(x => x.ID);
References(x => x.isRevisionOf)
.Column("ProductId") // column name must match the name specified in Product HasMany
.UniqueKey("Product_Revision")
.Not.Nullable();
Map(x => x.revision).UniqueKey("Product_Revision").Not.Nullable();
}
Inverse和KeyColumn是这个难题的缺失部分。
此映射在数据库中生成必需的约束,但您仍需要在业务逻辑中检查此约束,否则如果将具有重复名称的修订插入到版本集合中,您将获得SqlException。