使用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映射禁用延迟加载和错误地获取数据的主要内容,如果未能解决你的问题,请参考以下文章

英特尔4网口千兆网卡驱动下载

八度反向传播实现问题

最流畅的远程桌面,使用不卡顿最流畅的远程桌面,好用的软件

简单MySQL到CSV

游泳学习视频

鲁大师2022年Q1手机流畅榜:Redmi K50电竞版最流畅