Вільне Nhibernate внутрішнє з'єднання

У мене 3 таблиці (Master, Imagen, Linea) були:

Master
public virtual int Id { get; private set; }
public virtual Imagen imagen { get; set; }

Imagen
public virtual int Id { get; private set; }
public virtual Linea linea { get; set; }

Linea
public virtual int Id { get; private set; }
public virtual String Nombre { get; set; }

Мені потрібен такий запит:

SELECT * FROM dbo.Master 
INNER JOIN dbo.Imagen ON dbo.Master.imagen_id = dbo.Imagen.Id 
INNER JOIN dbo.Linea ON dbo.Imagen.linea_id = dbo.Linea.Id 
WHERE dbo.Linea_Id = 5

Але я не знаю, як сказати Fluent Nhibernate, щоб створити цей запит, використовуючи automapper. Поки що я спробував:

ICriteria c = session.CreateCriteria(typeof(Master))
  .CreateAlias("dbo.Imagen", "img", JoinType.InnerJoin)
  .Add(Restrictions.Eq("img.linea_id", id_linea));

return c.List();

Але я отримую цю помилку: не вдалося вирішити властивість: dbo з: ImageManager.Model.Entity.Master

Будь-які ідеї про те, як зробити внутрішнє приєднання? Спасибі заздалегідь

3

2 Відповіді

Для початку я б позбувся від dbo з dbo.Imagen. Використовуючи інтерфейс ICriteria, потрібно думати в термінах об'єктів, а не таблиць баз даних, навіть якщо може бути одне-одне відображення об'єкта в таблицю і властивості стовпців.

EDIT:
another option would be to use the QueryOver Lambda syntax.

   var list = session.QueryOver()
                        .JoinQueryOver(master => master.imagen)
                        .Where(imagen => imagen.linea.Id == 5)
                        .List();
8
додано
Вибачте за це ... як і раніше вивчаю синтаксис QueryOver. Виправити.
додано Автор Nathan Fisher, джерело
фіксований. Я перевірив це. Вона повинна працювати зараз.
додано Автор Nathan Fisher, джерело
Спасибі, Альреді зробив це. Im дійсно новий Fluent Nhibernate.
додано Автор lloiacono, джерело
Я спробував це, але я отримую цю помилку: "не може вирішити властивість: imagen.linea.Id з: ImageManager.Model.Entity.Master" я також змінив на. ), але я отримую ту ж помилку
додано Автор lloiacono, джерело
це працює !!!, велике спасибі. У всякому разі я в кінцевому підсумку з використанням ICriteria, тому що мені потрібно, щоб отримати зображення і лінії, пов'язані з цим майстром, ось чому я додав createalias для imagen і hdd, якщо я не зробив, що я отримую LazyLoadException, коли я намагаюся отримати доступ до зображень або HDD властивостей на мій головний об'єкт.
додано Автор lloiacono, джерело
Ось код: ICriteria c = session.CreateCriteria (typeof (MasterHdd)). "img.linea", "lin", JoinType.InnerJoin) .Додати (Restrictions.Eq ("lin.Id", id_linea)); return c.List ();
додано Автор lloiacono, джерело

Я не можу вийти з ваших попередніх коментарів, якщо ви вже виправили це, але я спробую

ICriteria c = session.CreateCriteria(typeof(Master))

.CreateAlias("imagen", "img", JoinType.InnerJoin)
.CreateAlias("img.linea", "lin", JoinType.InnerJoin)
.Add(Restrictions.Eq("lin.Id", 5));

return c.List();

EDIT: Корпус змінився, як зазначено нижче.

3
додано
Що ви отримуєте повідомлення про помилку?
додано Автор fluent, джерело
Гарне місце. Корпус змінився в моїй відповіді.
додано Автор fluent, джерело
Я думаю, що єдиною проблемою з цією відповіддю буде випадок об'єктних посилань. у вас є Imagen, де @lloiacono має посилання на об'єкт - це нижній регістр - imagen. Посилання на лінійку будуть однаковими. Це може бути причиною, чому він не працює.
додано Автор Nathan Fisher, джерело
Подивіться на літо nhibernate серії Stephen Bohlen, його кілька років зараз, але основи є для ICriteria і nhibernate в цілому. також перегляньте funnelweblog.com , це платформа з відкритим вихідним кодом на основі вільно-вільного мовлення
додано Автор Nathan Fisher, джерело
Велике спасибі, я зараз працюю над цим. Проблема в тому, що не працює. Це помилка, яку я отримую: "не вдалося вирішити властивість: Imagen з: ImageManager.Model.Entity.Master" Використовуючи автоматичне додавання до Map everythin під папкою моделі:. у папці моделі є папка з назвою Entity, і у мене є сутності:
додано Автор lloiacono, джерело
відкритий клас Master {public virtual int ID {get; приватний набір; } публічний віртуальний Imagen imagen {get; набір; } публічний віртуальний hdd hdd {get; набір; } публічний віртуальний рядок hash_master {get; набір; }}
додано Автор lloiacono, джерело
відкритий клас Linea {public virtual int Id {get; приватний набір; } public virtual int ObjVersion {get; набір; } публічний віртуальний рядковий номер {get; набір; } публічний віртуальний String Tabla {get; набір; } публічний віртуальний рядок NombreCorto {get; набір; }} відкритий клас Imagen {public virtual int Id {get; приватний набір; } публічний віртуальний номер рядка PartNumber {get; набір; } публічна віртуальна версія рядка {get; набір; } публічний віртуальний String So {get; набір; } публічна віртуальна версія рядка {get; набір; } публічна віртуальна Linea linea {get; набір; } публічний віртуальний рядковий номер {get; набір; }}
додано Автор lloiacono, джерело
Завдяки @NathanFisher це дійсно проблема. Я не отримую помилку більше, не могли б ви рекомендувати мені хороше керівництво для вільно, я читав вікі, але я не можу знайти anythin про Icriteria.
додано Автор lloiacono, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug