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>

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

4

2 回答 2

26

帕科说的不对。这可以在 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

这基本上意味着我需要连接这些表,以便从 FormStructure 表中检索所有列以及表中的DisplayOrder列,将FormField它们连接到匹配的FieldId列上。

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

  1. 我向我的FormStructure对象添加了一个名为 DisplayOrder 的属性。

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

这也将删除一些具有空值的行。为了避免这种情况(我最近遇到了这种情况),您可以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

据我所知,Fluent NHibernate 不支持这一点,就像许多其他遗留数据库特定的映射一样。恐怕您必须切换回 hbm.xml 或将流利的映射与 hbm.xml 混合

于 2009-08-06T21:10:16.370 回答