Fluent nhibernate NHibernate、遗留数据库、非';T

Fluent nhibernate NHibernate、遗留数据库、非';T,fluent-nhibernate,Fluent Nhibernate,我正在处理的项目有一个遗留数据库,其中包含大量用于改变应用程序行为的信息。基本上,我被一些我必须非常小心才能改变的事情所困扰 我的问题。此数据库中有一个表,此表中有一列。此列包含整数,并且此列中大多数预先存在的数据的值为零 问题是,该列实际上是对另一个实体的外键引用,只是在数据库模式中从来没有这样定义过 现在,在我的新代码中,我定义了Fluent-NHibernate映射,将此列视为引用,这样我就不必直接在代码中处理实体id。在我遇到此列中的值为0的实体之前,这一切都很正常 NHibernate

我正在处理的项目有一个遗留数据库,其中包含大量用于改变应用程序行为的信息。基本上,我被一些我必须非常小心才能改变的事情所困扰

我的问题。此数据库中有一个表,此表中有一列。此列包含整数,并且此列中大多数预先存在的数据的值为零

问题是,该列实际上是对另一个实体的外键引用,只是在数据库模式中从来没有这样定义过

现在,在我的新代码中,我定义了Fluent-NHibernate映射,将此列视为引用,这样我就不必直接在代码中处理实体id。在我遇到此列中的值为0的实体之前,这一切都很正常

NHibernate认为值0是一个有效的引用。当我的代码尝试使用引用的对象时,我会得到一个ObjectNotFoundException,因为很明显,我的数据库中没有id为0的对象


我如何通过映射或某种约定(我使用的是Fluent nhibernate),让nhibernate将0的id视为NULL?

我找到了API,告诉nhibernate忽略未找到的引用(NotFound.ignore()),而不是抛出异常。我在网上找到的SetAttribute()是一个比我现在使用的更旧版本的fluent nhibernate,我被所有提到的内容弄糊涂了。

我也遇到了同样的情况。not found=ignore的问题是,每次您尝试访问关系时,它都会重新查询该关系,即使它已经在原始查询中运行过。基本上,hibernate不存储关系另一端没有记录的事实。您可以在调试日志中看到这一点。下面是我当前项目的一个例子

loading entity:
attempting to resolve:
object not resolved in any cache:
Fetching entity:
loading entity:
Opened new IDbCommand, open IDbCommands: 1
Building an IDbCommand object for the SqlString: SELECT townshipdo0_.TOWNSHIP_CODE as TOWNSHIP1_203_0_, townshipdo0_.TOWNSHIP_NAME as TOWNSHIP2_203_0_, townshipdo0_.TOWNSHIP_TYPE_CODE as TOWNSHIP3_203_0_, townshipdo0_.TOWN_ACTIVE_FLAG as TOWN4_203_0_, townshipdo0_.VERS as VERS203_0_ FROM VTTOW_TOWN_CODE townshipdo0_ WHERE townshipdo0_.TOWNSHIP_CODE=?
binding ' ' to parameter: 0
SELECT townshipdo0_.TOWNSHIP_CODE as TOWNSHIP1_203_0_, townshipdo0_.TOWNSHIP_NAME as TOWNSHIP2_203_0_, townshipdo0_.TOWNSHIP_TYPE_CODE as TOWNSHIP3_203_0_, townshipdo0_.TOWN_ACTIVE_FLAG as TOWN4_203_0_, townshipdo0_.VERS as VERS203_0_ FROM VTTOW_TOWN_CODE townshipdo0_ WHERE townshipdo0_.TOWNSHIP_CODE=:p0
您可以看到它正在尝试绑定“”,此应用程序的DB使用空空间表示null(我知道这很愚蠢)。但是每次nhibernate遇到这个问题时,它都会尝试从数据库中查找它,因为它在缓存中找不到记录,也不知道它实际上是空的

如果我们可以在配置中指定一个默认的空值来忽略,那就太好了。目前唯一的解决方法是使用查询加载关系,而不是依赖nhibernate生成的查询