21

このマッピングをどのように流暢に行うのですか?

<class name="Person" table="People">

    <id name="Id">
        <generator class="identity"/>
    </id>

    <property name="Name" />

    <join table="Addresses">
        <key column="PersonId"/>
        <property name="Line1"/>
        <property name="Line2"/>
        <property name="City"/>
        <property name="Country"/>
        <property name="ZipCode"/>
    </join>

</class>

「参照」を使用できることはわかっていますが、関連するテーブルのすべての列が必要なわけではありません。必要なプロパティは1つだけです。

4

2 に答える 2

26

パコが言ったことは正しくありません。これは、FluentNHibernateで実行できます。私はかなり長い間自分でウェブを検索しましたが、このオプションについて話している人を見つけることができなかったので、FNHibernateを少し遊んで、ようやくそれを行うことができました。

これが私のシナリオでした:

私は2つのテーブルを持っています-

"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" }
"FormStructure" => Columns { "FormId", "FormType", "FieldId" }

これらは私の実体でした:

public class FormStructure
{
    public virtual Int32 FormId { get; private set; }
    public virtual Int32 FormType { get; set; }
    public virtual FormField FieldId { get; set; }
}

public class FormField
{
    public virtual int FieldId { get; private set; }
    public virtual String FieldName { get; set; }
    public virtual int? FieldType { get; set; }
    public virtual int? DisplayOrder { get; set; }
}

オブジェクトのリストを返すメソッドがクエリにいくつかありFormStructureます。DisplayOrderこれらのメソッドでオブジェクト内のフィールド順に並べ替えることができ、他の理由でもオブジェクトのプロパティとして使用できるようにFormFieldしたかったのです。DisplayOrderFormStructure

これは基本的に、FormStructureテーブルからすべての列を取得し、テーブルのDisplayOrder列と一緒にFormFieldテーブルを結合して、一致するFieldId列に結合する必要があることを意味します。

これを解決するために私がしたこと:

  1. DisplayOrderというプロパティをFormStructureオブジェクトに追加しました。

    public virtual int? DisplayOrder { get; set; }
    
  2. JoinこのメソッドをFormStructureマッピングクラスに追加したので、次のようになりました。

    public class FormStructureMap : ClassMap<FormStructure>
    {
        public FormStructureMap()
        {
            Table("FormStructure");
    
            Id(x => x.Id);
            Map(x => x.FormType);
            References(x => x.Schedule).Column("ScheduleId");
            References(x => x.Field).Column("FieldId");
            Map(x => x.IsMandatory).Nullable();
    
            Join("FormFields", m =>
            {
                m.Fetch.Join();
                m.KeyColumn("FieldId");
                m.Map(t => t.DisplayOrder).Nullable();
            });
        }
    }
    

このJoinメソッドは、Join内のKeyColumnメソッドで定義した列の2つのテーブル間で明らかに結合します。

これにより、null値を持つ行の一部も削除されます。これを回避するために(最近これに遭遇しました) 、メソッドm.Optional();内に追加できます。Join

これで、オブジェクトのリストを取得し、FormStructureそれらを並べ替えてDisplayOrder、オブジェクトDisplayOrderのプロパティとして使用できるようになりましたFormStructure

return session.CreateCriteria<FormStructure>()
              .Add(Expression.Eq("FieldName", fieldName))
              .AddOrder(Order.Asc("DisplayOrder"))
              .List<FormStructure>();

DisplayOrder私が持っているOrder句の列を認識していなかったため、これは以前は実行できませんでした。

于 2010-06-27T18:00:22.180 に答える
0

私の知る限り、これは他の多くのレガシーデータベース固有のマッピングとは異なり、FluentNHibernateではサポートされていません。恐れ入りますが、hbm.xmlに戻すか、流暢なマッピングをhbm.xmlと混合する必要があります。

于 2009-08-06T21:10:16.370 に答える