与UniqueKey约束的一对多关系

时间:2011-04-27 15:30:59

标签: sql-server-2008 fluent-nhibernate has-many unique-key

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

谢谢, 埃里克

1 个答案:

答案 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。