Ответ 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
. Я хотел, чтобы эти методы дали мне упорядоченные поля DisplayOrder
в объекте FormField
и хотели, чтобы DisplayOrder
был доступен как свойство в моем объекте FormStructure
по другим причинам.
В основном это означает, что мне нужно присоединиться к таблицам, чтобы получить все столбцы из таблицы FormStructure вместе с столбцом DisplayOrder
из таблицы FormField
, объединив их в соответствующих столбцах FieldId
.
Что я сделал, чтобы решить эту проблему:
-
Я добавил свойство DisplayOrder к моему объекту
FormStructure
.public virtual int? DisplayOrder { get; set; }
-
Я добавил метод
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, которое у меня там.