我正在处理一个遗留数据库,在这里,FK并不总是被使用的。例如,我有一个实体人和一个实体国家。一个人有一个国家,在人的地图中被映射为多对一.
<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查询?
谢谢
发布于 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 .
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);
}
...https://stackoverflow.com/questions/13726668
复制相似问题