Fluent-Nhibernate Ссылки и PropertyRef Выбор с Lazy Load - PullRequest
3 голосов
/ 03 февраля 2011

Я использую PropertyRef для одного из моих References свойств. С LazyLoad() он по-прежнему выполняет Select и загружает сущность User, хотя я никогда не "нажимаю" свойство SalesPerson.

Отображение заказа

Id(x => x.Id).GeneratedBy.Native();
References(x => x.SalesPerson)
                        .LazyLoad()
                        .PropertyRef(x => x.Username)
                        .Column("rsm");
Map(x => x.Title);

Класс заказа

public class Order : BaseEntity
{
    ...
    public virtual User SalesPerson { get; set; }
    public virtual string Title { get; set; }
    ...
}

Отображение пользователя

Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Username).Column("login");

Класс пользователя

public class User : BaseEntity
{
     public virtual string Username { get; set; }
     ...
}

Отображение сгенерированного заказа

<many-to-one class="Project.User" lazy="proxy" name="SalesPerson" property-ref="Username">
      <column name="rsm" />
</many-to-one>

Выполнение кода

var order = session.Get<Order>(1);
Console.WriteLine(order.Title);

Можно ли вообще запретить загрузку сущности пользователя, если я не использую сущность User?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

имеет отношение к собственности см. См. NHibernate создает прокси через session.Load (), но не через Linq или Criteria API

И не то, что вы спросили, но также учтите, что много-к-одному с прокси не позволяет выполнять проверку типов, если вы подкласс пользователя, см. http://ayende.com/Blog/archive/2010/01/28/nhibernate-new-feature-no-proxy-associations.aspx

1 голос
/ 29 июня 2013

Не думаю, что это ошибка в NHibernate.Это зависит от вашего отображения.

Во-первых, помните, что карта ссылок объединит ключ (первичный ключ и внешний ключ) между двумя таблицами отображения.Чтобы предотвратить SELECT + 1, просто игнорируйте соединение клавиш.

References(x => x.SalesPerson)
                    .LazyLoad()
                    .PropertyRef(x => x.Username)
                    WithForeignKeyName("none") //disable key join.
...