2011-02-03 1 views
3

Я использую PropertyRef для одного из моих References объектов. С LazyLoad() он по-прежнему выполняет выбор и загружает объект User, хотя я никогда не «ударяю» свойство SalesPerson.Fluent-Nhibernate Ссылки и PropertyRef Делать выбор с ленивой загрузкой

Mapping Заказать

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; } 
    ... 
} 

Mapping Пользователь

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

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

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

Сформирован заказ Mapping

<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

имеет отношение к собственности-реф см NHibernate creates proxy via session.Load(), but not via Linq or Criteria API

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

+0

Думаю, я собираюсь изменить свою схему, чтобы использовать фактические идентификаторы, все это не стоит хлопот и является плохой практикой. Спасибо за ссылки. – mxmissile

1

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

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

References(x => x.SalesPerson) 
        .LazyLoad() 
        .PropertyRef(x => x.Username) 
        WithForeignKeyName("none") //disable key join. 
Смежные вопросы