【问题标题】:NHibernate Prevent Lazy Loading of unmatched referenceNHibernate 防止延迟加载不匹配的引用
【发布时间】:2017-06-22 22:14:08
【问题描述】:

我对 NHibernate 有很大的问题。我有从 Table1 到 Table2 的引用,并且我希望 NHibernate 能够,当在 Table2 中找不到相应的记录时,不要再针对 Table2 发出 SELECT 语句,我不知道,真的要确保它实际上不在那里。

我尝试在我的引用中添加.LazyLoad(Laziness.False).NotFound.Ignore() 之类的修饰符,但NHibernate 以极大的偏见愉快地忽略了我的命令,发出它的选择并破坏了我的代码。

【问题讨论】:

  • 我不明白...如果不发出 SELECT 来检查它,NHibernate 怎么知道该记录不存在?
  • 检查 Left Join 是否返回 NULL id,我只能想象它的作用,因为它仅在 JOIN 返回为空时才发出 SELECT,而不是留下足够好的单独。跨度>
  • NH 不缓存对象的存在。它不会缓存不存在的对象。水合过程(对象实例化)甚至必须从不包含引用表的底层结果集中工作。
  • Ignore 只是容忍无效外键值的拐杖。但问题的根源在于无效的外键值。将它们保存在数据库中会暴露出像您这样的问题。现在,如果你可以contribute 一个 PR 来避免这些选择,也许它会被接受。但由于这看起来像是对低使用率功能的优化,如果该 PR 影响很大,它可能不会被接受。

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping


【解决方案1】:

这是正确的,NHibernate 尝试加载“不存在”。它必须这样做。

如此处所述Ayende - NHibernate Mapping(摘录):

12) not-found 是另一个 legacy 功能,它控制 NHibernate 如何 当它发现一个无效的外键时表现。也就是说,一个值 指向一个不存在的实体。默认情况下,这将触发 一个错误,因为这通常表明数据库有问题,但是 使用旧数据库,您可以告诉它将属性值设置为 而是 null。

可以在这里找到:Lazy loading for NHibernate with Ignore.NotFound(摘录):

当您指定 .NotFound().Ignore() 时,这会强制实体 急切地加载并且不能用 .LazyLoad() 覆盖。 NHibernate 这样做是因为它必须确保这种关系 存在或不存在,因为您不依赖数据库 强制执行。

这里Why Nhibernate won't lazy load my many-to-one relationship?,José F. Romaniello 说:

这是你的问题,nhibernate 必须确定,发票 每次注册都存在或不存在。

我强烈建议您解决数据问题并删除 not-found="忽略" 属性。这是一件坏事。

【讨论】:

  • 我真的不明白 NHibernate 如何或为什么必须这样做。我是左加入的,有时那里有东西,有时没有,如果有任何方法可以禁用额外的选择,那么根本就不会有问题。我的左连接是否产生值对 NHibernate 有什么影响?
  • 真正的问题实际上是您的Table1 填充了Table2Id 列,其值不是NULL。这表明Table2ID列)中必须有对应的ID。只有在明确 Table2Id 为 NULL 的情况下,才无需搜索该引用。解决方案是 1) 用 NULL 替换 Table1 中所有不存在的值 2) 将缺失值引入 Table2。我知道从您的角度来看,这不是问题……但也许可以尝试考虑如何“手动”进行操作。怎么可能知道 ID 不应该被搜索?
  • 好吧,替换值或引入缺失值很遗憾不是可行的选项。只有 nh 接受某些连接不会产生结果才会起作用。
  • 我的情况和你一样。我打赌not-found="ignored" 并面临同样的问题。临时解决方案是一些硬编码,但最终“修复”数据库是我们选择的方式
  • 我想说,安德烈亚斯,我真的明白你在尝试什么。但是,正如我试图解释为您的问题的答案那样,NHibernate 就是这样运行的。我强烈建议,尝试调查如何修复数据库的可能性,而不是调整 NHiberante。但只是一个建议;)
【解决方案2】:

试试

.Not.LazyLoad(); 

而不是 .LazyLoad(laziness.false);

【讨论】:

  • 我做了,但不起作用,.LazyLoad() 的帮助文本提到它不适用于 .Not
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2013-12-10
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多