3

我正在使用一个不总是使用 FK 的遗留数据库。例如,我有一个实体 Person 和一个实体 Country。一个人有一个 Country,它在 Person 映射中被映射为多对一。

<many-to-one name="Country" class="Country" foreign-key="none" lazy="false" not-found="ignore" fetch="join" outer-join="true" column="countryid"/>

当人具有null列值(countryid)时,它不会执行额外的选择查询(因为它知道国家表中不会有引用),但是当人具有0列值时,NH 将执行另一个选择查询如果该国家/地区实际上不存在,请检查国家/地区表。但是因为我们做了一个左外连接,NH 应该已经知道它不存在。只是为了澄清一下,如果列的值为1并且它存在于国家表中,它将不会执行额外的选择。

反正有没有告诉 NHibernate 不要做额外的选择查询?

谢谢

4

1 回答 1

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 扩展点,比如 custom 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);
    }
...
于 2012-12-05T18:22:23.390 回答