使用NotFound.Ignore()的流畅Nhibernate映射禁用延迟加载和错误地获取数据

问题描述 投票:1回答:1

我有以下两个表(模式简化):

Device
    Id, IMSI, ...

SIM
    IMSI, PhoneNumber, ...

因为设备可以使用不在SIM表中的SIM卡,所以我在Device.Map类中使用以下流畅的nhibernate映射:

References(x => x.Sim).Column("IMSI").NotFound.Ignore();

这工作按预期工作,直到我写了一个返回所有设备(几千)和内存使用天空飙升的查询。

SQL分析器显示而不是使用join生成一个单独的查询。 Nhibernate生成一个查询以获取所有设备,然后生成数千个查询以获取每个设备的SIM。

我尝试在映射中添加Fetch.Join()但得到了相同的结果。

我认为Nhibernate应该能够使用左连接生成单个查询并获得相同的结果。但我无法找到如何做到这一点。任何帮助将不胜感激。

sql sql-server nhibernate fluent-nhibernate
1个回答
0
投票

有了这个查询:

var devices = session.Query<Device>()
    .Fetch(x => x.Sim)
    .ToList();

你会得到(几乎)你想要的东西。

NHibernate将在表之间生成LEFT OUTER JOIN,但仍然为任何SELECT生成单独的Device而没有相应的SIM

© www.soinside.com 2019 - 2024. All rights reserved.