如何在流畅的nhibernate中加入表

时间:2009-08-06 19:52:59

标签: nhibernate fluent

我们怎么做this mapping但是流利?

<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>

我知道我可以使用'参考',但我不需要相关表格中的所有列。我只需要一个房产。

2 个答案:

答案 0 :(得分:25)

Paco所说的不对。这可以在Fluent NHibernate中完成。 我在网上搜索了很长一段时间,找不到任何人谈论这个选项,所以我只是玩了一点FNHibernate并最终设法做到了。

这是我的情景:

我有两张桌子 -

"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字段对它进行排序,并希望DisplayOrder可用作FormStructure对象中的属性,原因可能是其他原因好。

这基本上意味着我需要连接表,以便我从Form DisplayOrder表中检索FormStructure表中的所有列以及FormField列,并在匹配的{{1列。

我为解决这个问题做了什么:

  1. 我在我的FieldId对象中添加了一个名为DisplayOrder的属性。

    FormStructure
  2. 我将public virtual int? DisplayOrder { get; set; } 方法添加到我的Join映射类中,所以它看起来像这样。

    FormStructure
  3. 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中的KeyColumn方法中定义的列上的两个表之间进行连接。

    这也将删除一些具有空值的行。为了避免这种情况(我最近遇到过这种情况),您可以在Join方法中添加m.Optional();

    我现在可以检索Join个对象的列表,按FormStructure排序,甚至可以DisplayOrder作为DisplayOrder对象中的属性。

    FormStructure

    以前不可能这样做,因为它不会识别我在那里的Order子句中的return session.CreateCriteria<FormStructure>() .Add(Expression.Eq("FieldName", fieldName)) .AddOrder(Order.Asc("DisplayOrder")) .List<FormStructure>(); 列。

答案 1 :(得分:0)

据我所知,Fluent NHibernate不支持这种方式,就像许多其他遗留数据库特定的映射一样。我担心你必须切换回hbm.xml或将流畅的映射与hbm.xml混合