如何在fluent nhibernate中联接表

如何在fluent nhibernate中联接表,nhibernate,fluent,Nhibernate,Fluent,我们怎么做,但流利 <class name="Person" table="People"> <id name="Id"> <generator class="identity"/> </id> <property name="Name" /> <join table="Addresses"> <key column="PersonId"/>

我们怎么做,但流利

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


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

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

Paco所说的不正确。这可以在流利的NHibernate中完成。 我自己在网上搜索了很长一段时间,找不到任何人谈论这个选项,所以我只是玩了一会儿Hibernate,最后成功地做到了

这是我的设想:

我有两张桌子-

"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
字段对它们进行排序,并且出于其他原因,我希望
DisplayOrder
作为我的
FormStructure
对象中的属性可用

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

我是如何解决这个问题的:

  • 我在
    FormStructure
    对象中添加了一个名为DisplayOrder的属性

    public virtual int? DisplayOrder { get; set; }
    
    return session.CreateCriteria<FormStructure>()
                  .Add(Expression.Eq("FieldName", fieldName))
                  .AddOrder(Order.Asc("DisplayOrder"))
                  .List<FormStructure>();
    
  • 我将
    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();
            });
        }
    }
    

    这以前不可能做到,因为它不会识别我在那里的Order子句中的
    DisplayOrder
    列。

    我遇到了同样的问题。我已经流畅地映射了我的所有表,我只需要在联接中添加一列,如链接所示。如何在xml映射中混合使用fluent映射和添加的映射?不过,有趣的是,关于带有子类映射的Join()方法的文档中说,对于第二个操作参数Join()->“这只适用于表/继承层次结构策略。