【问题标题】:Fluent-Nhibernate References and PropertyRef Doing a Select With Lazy LoadFluent-Nhibernate 引用和 PropertyRef 使用延迟加载进行选择
【发布时间】:2013-06-29 11:19:21
【问题描述】:

我将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 实体时,有没有办法阻止 Select 加载用户实体?

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping


    【解决方案1】:

    与 property-ref 有关,请参阅 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

    【讨论】:

    • 认为我要更改架构以使用实际的 ID,这整件事不值得麻烦,而且是不好的做法。感谢您的链接。
    【解决方案2】:

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

    首先,请记住参考映射将连接 2 个映射表之间的键(主键和外键)。要防止 SELECT + 1,只需忽略键连接即可。

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

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2011-05-09
      • 2010-11-04
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多