【问题标题】:How to join table in fluent nhibernate如何在流利的nhibernate中加入表格
【发布时间】:2010-11-17 11:32:13
【问题描述】:

我们如何做到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>

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

【问题讨论】:

    标签: nhibernate fluent


    【解决方案1】:

    帕科说的不对。这可以在 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 字段排序,并且出于其他原因也希望DisplayOrder 作为我的FormStructure 对象中的属性。

    这基本上意味着我需要加入这些表,以便从 FormStructure 表中检索所有列以及 FormField 表中的 DisplayOrder 列,并将它们加入到匹配的 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 方法中定义的列上的两个表之间连接。

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

    我现在可以检索FormStructure 对象的列表,按DisplayOrder 对它们进行排序,甚至可以将DisplayOrder 用作FormStructure 对象中的属性。

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

    这是以前无法做到的,因为它无法识别我在 Order 子句中的 DisplayOrder 列。

    【讨论】:

    • 不过,有趣的是,带有子类映射的 Join() 方法的文档说明了 Join() 的第二个 Action 参数 -> “这仅适用于每个表继承层次结构策略。
    【解决方案2】:

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

    【讨论】:

    • 我刚刚遇到了同样的问题。我已经流利地映射了所有表,我只需要在连接中添加一列,如链接所示。如何将我的流利映射与 xml 映射中的这个添加混合在一起?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多