NHibernate - ссылка без (всегда) соединения SQL - PullRequest
0 голосов
/ 27 января 2012

У меня есть вопрос, который может пахнуть запахом кода / дизайна, но я все равно его задам.

Скажем, у меня есть два тривиальных класса ниже:

public class PostOffice
{
    public virtual string ZipCode {get; set;}
    public virtual string StreetAddress {get; set;}
}

public class Person
{
    public virtual in ID {get; protected set;}
    public virtual string FirstName {get; set;}
    public virtual string LastName {get; set;}
    public virtual PostOffice ZipCode {get; set;}
}

и я использовал FluentNHibernate, чтобы установить PostOffice.ZipCode в качестве идентификатора, и предоставил переопределение отображения ниже:

model.Override<Person>(p=> p.References( z=> z.ZipCode, "ZipCode"));

Person.ZipCode в базе данных - это просто VARCHAR, и я обычно пишу некоторый SQLкак

SELECT * 
FROM Person 
WHERE ZipCode = '90210'

, но если у меня есть сеанс NHibernate и я выполняю что-то вроде следующего:

session.Query<Person>().Where(p=>p.ZipCode == '90210')

, результирующий SQL (довольно печатный) выглядит как

SELECT p.* 
FROM Person p INNER JOIN PostOffice o 
    ON p.ZipCode = o.ZipCode 
WHERE o.ZipCode = '90210'

Мой вопрос - если сущности по умолчанию являются отложенными, можно ли указать некоторые свойства сопоставления, чтобы NHibernate генерировал SQL без объединения?Пример тривиален, но в моей реальной ситуации таблица, к которой присоединяются, содержит миллионы строк, поэтому я хотел бы избежать объединения, если это возможно.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 января 2012

Если поля ZipCode и StreetAddress на самом деле находятся в таблице Person, то вам необходимо отобразить PostOffice как Component, а не Reference.

http://wiki.fluentnhibernate.org/Auto_mapping#Components

Редактировать:

Возможно, вы сможете сопоставить отдельное свойство только с этим полем ZipCode.

public class Person
{
    public virtual in ID {get; protected set;}
    public virtual string FirstName {get; set;}
    public virtual string LastName {get; set;}
    public virtual string ZipCode { get; set; }
    public virtual PostOffice PostOffice {get; set;}
}

model.Override<Person>(p=> 
    p.References( z=> z.PostOffice, "ZipCode")
     .Not.Update()
     .Not.Insert()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...