如何在Fluent NHibernate中加入表格

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>

我知道可以使用“引用”,但我不需要来自相关表的所有列,我只需要一个属性。

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对象列表。我希望这些方法按照FormField对象中的DisplayOrder字段排序,并且希望在我的FormStructure对象中提供DisplayOrder属性以便其他用途。

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

我解决这个问题的方法:

  1. I added a property called DisplayOrder to my FormStructure object.

    public virtual int? DisplayOrder { get; set; }
    
  2. I added the Join method to my FormStructure mapping class so it looked like this.

    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 方法中定义的列明确地连接两个表格。这还将删除一些具有 null 值的行。为了避免这种情况(我最近遇到过),您可以在 Join 方法中添加 m.Optional();
现在,我可以检索 FormStructure 对象列表,按 DisplayOrder 排序,甚至可以将 DisplayOrder 作为 FormStructure 对象的属性。
return session.CreateCriteria<FormStructure>()
              .Add(Expression.Eq("FieldName", fieldName))
              .AddOrder(Order.Asc("DisplayOrder"))
              .List<FormStructure>();

以前无法完成这个操作,因为它不能识别我在订单子句中的DisplayOrder列。


有趣的是,关于Join()方法与子类映射的文档表示,对于Join()的第二个Action参数 -> "只有在使用表继承层次结构策略时才有效。 - PandaWood

0
据我所知,这在Fluent NHibernate中不受支持,就像许多其他遗留数据库特定映射一样。恐怕您必须退回到hbm.xml或将流畅映射与hbm.xml混合使用。

我遇到了完全相同的问题。我已经流畅地映射了所有的表,现在我需要在一个连接中添加一个列,就像链接中所示的那样。 我该如何将我的流畅映射与 XML 映射中的这个添加混合起来? - gillyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接