1

我是 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 约束,不是吗?

谢谢,埃里克

4

1 回答 1

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。

于 2011-04-27T18:12:48.010 回答