我正在使用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实体?
答案 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.