Fluent-Nhibernate References and PropertyRef Doing

2019-02-15 09:36发布

I am using PropertyRef for one of my References properties. With LazyLoad() it still does a Select and loads the User entity, even though I never "hit" the SalesPerson property.

Order Mapping

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

Order Class

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

User Mapping

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

User Class

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

Generated Order Mapping

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

Executing Code

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

Is there anyway to prevent the Select to load the User entity when I'm not using the User entity?

2条回答
兄弟一词,经得起流年.
2楼-- · 2019-02-15 09:47

I don't think this is a bug in NHibernate. It depends on your mapping.

First, remember that the reference map will join the key (primary key and foreign key) between 2 mapping tables. To prevent SELECT + 1, just ignore the key joint.

References(x => x.SalesPerson)
                    .LazyLoad()
                    .PropertyRef(x => x.Username)
                    WithForeignKeyName("none") //disable key join.
查看更多
别忘想泡老子
3楼-- · 2019-02-15 10:07

Has to do with property-ref see NHibernate creates proxy via session.Load(), but not via Linq or Criteria API

And not that you asked, but also consider that many-to-one with proxy does not allow you to do type-checking if you subclass User, see http://ayende.com/Blog/archive/2010/01/28/nhibernate-new-feature-no-proxy-associations.aspx

查看更多
登录 后发表回答