使用NotFound.Ignore()的流畅Nhibernate映射禁用延迟加载和错误地获取数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NotFound.Ignore()的流畅Nhibernate映射禁用延迟加载和错误地获取数据相关的知识,希望对你有一定的参考价值。
我有以下两个表(模式简化):
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应该能够使用左连接生成单个查询并获得相同的结果。但我无法找到如何做到这一点。任何帮助将不胜感激。
答案
有了这个查询:
var devices = session.Query<Device>()
.Fetch(x => x.Sim)
.ToList();
你会得到(几乎)你想要的东西。
NHibernate将在表之间生成LEFT OUTER JOIN
,但仍然为任何SELECT
生成单独的Device
而没有相应的SIM
。
以上是关于使用NotFound.Ignore()的流畅Nhibernate映射禁用延迟加载和错误地获取数据的主要内容,如果未能解决你的问题,请参考以下文章