如何使用Fluent Nhibernate多对多以获得最佳性能?

时间:2010-07-14 19:09:39

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个与自身有多对多关系的产品表(使用两列多对多表),我使用以下代码在Fluent NHibernate中进行了设置:

public class ProductConfiguration : ClassMap<Product>
{
    public ProductConfiguration()
    {
        Table("Product");
        Id(p => p.Id).GeneratedBy.Guid();

        Map(p => p.Name).Not.Nullable().Length(254);
        Map(p => p.Description).Not.Nullable().Length(1000);
        Map(p => p.CreatedAt).Not.Nullable();

        HasManyToMany(p => p.CrossSell)
            .Table("ProductCrossSell")
            .ParentKeyColumn("Id")
            .ChildKeyColumn("ProductId"); 
    }
}

我的MVC应用程序有两个页面使用此设置:

  • 索引 - 使用通用存储库GetAll方法显示所有产品。
  • 详细信息 - 使用通用存储库GetById方法在多对多关系中显示一个产品和任何相关的交叉销售产品设置。

默认情况下,NHibernate设置为多对多的LazyLoad,所以当我启动应用程序并在分析器中观察它时,我可以看到它通过以下警告实现了LazyLoad多对多“使用不建议使用隐式交易“。

  1. 如何摆脱此警报?我找不到任何有关如何在事务中包装LazyLoad以消除警报的信息。它甚至可能吗?
  2. 有没有办法不通过告诉NHibernate懒惰加载每当我要求GetById确保加入表时,在一个查询中获取所有内容?我尝试在多对多映射中使用.Fetch.Join(),但这也影响了我的GetAll查询,该查询现在显示了一个不正确的连接结果集。
  3. 这种简单场景的最佳评价是什么?

    由于

2 个答案:

答案 0 :(得分:0)

默认情况下,所有集合都在NHibernate中延迟加载。

您必须通过某种类型的呼叫触发加载(甚至可能使用调试器监视)

答案 1 :(得分:0)

  1. 摆脱警告的方法是访问对象图并完全填充单个事务中的UI元素。

  2. 不是配置。您可以创建一个急切获取关联的HQL查询,并将该查询用于特定视图。我会坚持使用延迟加载,除非需要,否则不进行优化。 HQL将是:


  3. return session.CreateQuery("from ProductionConfiguration pc join fetch pc.CrossSell where pc.Id = ?")
        .SetGuid(0, id)
        .List<ProductConfiguration>();