1

Fluent-NHibernate は初めてです。私の問題は、2 つのエンティティ間に 1 対多の関係を確立したいということです。製品は複数の (一意の) リビジョンを持つことができ、特定のリビジョンは 1 つの製品にのみ属します。たとえば、Product1 にはリビジョン "a" とリビジョン "b" がありますが、2 つのリビジョン "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

これは双方向の 1 対多の関係であり、マッピングは次のようになります。

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 に答える