Nhibernate为一对一映射生成太多查询

时间:2013-01-30 08:02:24

标签: nhibernate one-to-one

当应用程序加载时,我会将所有广告系列收费到内存中:

var all = session.Query<Campaign>().ToList();

广告系列有一项服务。

public CampaignMap()
{
  Table("`TR_Campaigns`");
  Schema("dbo");
  Not.LazyLoad();
  Id(x => .Id).GeneratedBy.Increment().Column("CampaignID");
  References(x => x.Service).Column("ServiceID").Not.LazyLoad();
  // I also tried hasone and it is bringing the same result
}

这是服务地图:

public ServiceMap()
{
  Not.LazyLoad();
  Table("`TR_Services`");
  Id(x => x.Id, "ServiceID").GeneratedBy.Increment();
  Map(x => x.Name,"ServiceName");
}

问题在于,当我有100个广告系列,并且每个广告系列都有不同的服务时,该映射会生成100个查询,以获取每个广告系列的每项服务。 例如,如果ServiceID 2在多个广告系列中重复出现,则查询… WHERE service0_.ServiceID = 2将只运行一次(这很好)。

这是生成的查询:

SELECT service0_.ServiceID   as ServiceID4_0_,
       service0_.ServiceName as ServiceN2_4_0_
FROM   [TR_Services] service0_
WHERE  service0_.ServiceID = 8

这是正常的吗?当我有1000个服务或1000个服务甚至更多的活动时,我该怎么办...

由于

更新
我看到你的编辑,我认为这是工作 但CampaignMap有更多关系,例如:

 HasMany(x => x.LandingPageWeights).KeyColumn("CampaignID").Not.LazyLoad();

如何根据您的查询处理它? 执行LandingPageWeights = x.LandingPageWeights失败....
你对此有何建议?
感谢

2 个答案:

答案 0 :(得分:1)

阅读本文

可以避免n + 1问题

http://ayende.com/blog/1328/combating-the-select-n-1-problem-in-nhibernate

这样回答

Prevent Fluent NHibernate select n+1

修改

选择没有n + 1问题的所有数据

var items = session.Query<Campaign>().Select(x=> new Campaign
{
  Id = x.Id,
  Service = new Service
  {
     Id = x.Service.Id,
     Name = x.Service.Name
  }
}).ToList();

答案 1 :(得分:1)

我想我找到了它。 我减少了2个查询:

var all = session.Query<Campaign>()
                            .Fetch(x => x.Service)
                            .Fetch(x => x.Supplier)
                            .ToList();

这个在一个查询中为我提供服务。

谢谢!