首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate强制not忽略不执行额外的选择

NHibernate强制not忽略不执行额外的选择
EN

Stack Overflow用户
提问于 2012-12-05 15:30:00
回答 1查看 3.5K关注 0票数 3

我正在处理一个遗留数据库,在这里,FK并不总是被使用的。例如,我有一个实体人和一个实体国家。一个人有一个国家,在人的地图中被映射为多对一.

代码语言:javascript
复制
<many-to-one name="Country" class="Country" foreign-key="none" lazy="false" not-found="ignore" fetch="join" outer-join="true" column="countryid"/>

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

是否要告诉NHibernate不要执行额外的select查询?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-12-05 18:22:23

不,没有办法通过配置来做到这一点。很好的文章如何改进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 .

代码语言:javascript
复制
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);
    }
...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13726668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档