Fluent-Nhibernate引用和PropertyRef使用延迟加载进行选择

时间:2011-02-03 15:35:00

标签: nhibernate fluent-nhibernate nhibernate-mapping

我正在使用PropertyRef作为我的References个属性之一。使用LazyLoad()它仍会执行选择并加载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实体时,是否有阻止Select加载User实体?

2 个答案:

答案 0 :(得分:2)

与property-ref有关 NHibernate creates proxy via session.Load(), but not via Linq or Criteria API

并不是你问过,但也考虑到代理多对一不允许你进行类型检查,如果你是子类User,请参阅 http://ayende.com/Blog/archive/2010/01/28/nhibernate-new-feature-no-proxy-associations.aspx

答案 1 :(得分:1)

我认为这不是NHibernate中的错误。这取决于你的映射。

首先,请记住引用映射将在两个映射表之间连接密钥(主键和外键)。要防止SELECT + 1,只需忽略键关节。

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