Как присоединиться к таблице в беглой nhibernate - PullRequest
21 голосов
/ 06 августа 2009

как нам сделать это отображение но бегло?

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

25 голосов
/ 27 июня 2010

То, что сказал Пако, неверно. Это можно сделать в 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. Я добавил свойство DisplayOrder в свой FormStructure объект.

    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 очевидно объединит две таблицы в столбце, который вы определили в методе KeyColumn в Join.

Это также удалит некоторые строки, имеющие нулевые значения. Чтобы избежать этого (я столкнулся с этим недавно), вы можете добавить m.Optional(); в метод Join.

Теперь я могу получить список FormStructure объектов, упорядочить их по DisplayOrder и даже иметь DisplayOrder в качестве свойства объекта FormStructure.

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

Этого нельзя было сделать раньше, потому что он не распознал бы столбец DisplayOrder в предложении Order, которое у меня там есть.

0 голосов
/ 07 августа 2009

Насколько я знаю, это не поддерживается в Fluent NHibernate, как и многие другие сопоставления, связанные с устаревшей базой данных. Боюсь, вам придется переключиться обратно на hbm.xml или смешать текущие сопоставления с hbm.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...