NHibernate force not-found忽略不执行额外选择

时间:2012-12-05 15:30:01

标签: nhibernate many-to-many nhibernate-mapping

我正在使用遗留数据库,其中并不总是使用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不要做额外的选择查询?

由于

1 个答案:

答案 0 :(得分:4)

不,如何通过配置无法做到这一点。好的帖子如何改进 not-found="ignore"功能:

http://nhforge.org/blogs/nhibernate/archive/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.aspx

我们可以使用一些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);
    }
...