我正在使用遗留数据库,其中并不总是使用FK。 例如,我有一个实体Person和一个实体Country。一个人有一个在Person映射中被映射为多对一的Country。
<many-to-one name="Country" class="Country" foreign-key="none" lazy="false" not-found="ignore" fetch="join" outer-join="true" column="countryid"/>
当人员null
作为列值(countryid)时,它不会执行额外的选择查询(因为它知道国家/地区表中不会有引用),但是当某人有{ {1}}作为列值NH将执行另一个选择以检查国家/地区列表,该国家实际上不存在。但是因为我们做左外连接,NH应该已经知道它不存在。
只是为了澄清一下,如果列的值为0
并且它存在于国家/地区表中,则它不会执行额外的选择。
有没有告诉NHibernate不要做额外的选择查询?
由于
答案 0 :(得分:4)
不,如何通过配置无法做到这一点。好的帖子如何改进 not-found="ignore"
功能:
我们可以使用一些NHibernate扩展点,如自定义PocoEntityTuplizer
,但没有简单的配置,没有设置......
一些提取:
从上面的链接(阅读它以获取更多详细信息)。在Person
实体的构建过程中,集合object[] values
也包含CountryProxy
。假设DB中缺少Id == 0(在需要时使用您自己的逻辑)。此代理将替换为null
,因此不会执行SELECT ...
public class NullableTuplizer : PocoEntityTuplizer
{
public override void SetPropertyValues(object entity, object[] values)
{
for (int i = 0; i < values.Length; i++)
{
if (typeof (Country).IsAssignableFrom(getters[i ].ReturnType)
&& ((Country) values[i]).Id == 0) // missing id
{
values[i] = null; // here change a Proxy to null
}
}
base.SetPropertyValues(entity, values);
}
...