[英]nhibernate, 0 in foreign key column
我有一個遺留數據庫,其中在FK列中使用值0表示沒有指定任何關系。
這不是我可以以微不足道的方式改變的東西。 是否有可能告訴NHibernate在指定的列中將0視為null?
編輯
我知道not-found
,但我只想忽略那些0。
有一個類似的問題: NHibernate將0保存為多對一列而不是null 。 Noel Kennedy有一個有趣但有點奇怪的解決方案。
我可能會在數據庫中存儲ID為0的記錄,它代表一個Null對象。
這個解決方案對我們很有用: http : //nhibernate.info/blog/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.html
簡而言之:
添加以下類:
public class NullableTuplizer : PocoEntityTuplizer
{
public NullableTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity)
: base(entityMetamodel, mappedEntity)
{
}
public override object[] GetPropertyValuesToInsert(
object entity, IDictionary mergeMap, ISessionImplementor session)
{
object[] values = base.GetPropertyValuesToInsert(entity, mergeMap, session);
//dirty hack 1
for (int i = 0; i < values.Length; i++)
{
if (values[i ] == null && typeof (IEntity).IsAssignableFrom(getters[i ].ReturnType))
{
values[i ] = ProxyFactory.GetProxy(0, null);
}
}
return values;
}
public override object[] GetPropertyValues(object entity)
{
object[] values = base.GetPropertyValues(entity);
//dirty hack 2
for (int i = 0; i < values.Length; i++)
{
if (values[i ] == null && typeof (IEntity).IsAssignableFrom(getters[i ].ReturnType))
{
values[i ] = ProxyFactory.GetProxy(0, null);
}
}
return values;
}
public override void SetPropertyValues(object entity, object[] values)
{
//dirty hack 3.
for (int i = 0; i < values.Length; i++)
{
if (typeof (IEntity).IsAssignableFrom(getters[i ].ReturnType)
&& ((IEntity) values[i ]).Id == 0)
{
values[i ] = null;
}
}
base.SetPropertyValues(entity, values);
}
}
然后為每個相關映射注冊它:
foreach (var persistentClass in configuration.ClassMappings)
{
persistentClass.AddTuplizer(EntityMode.Poco, typeof(NullableTuplizer).AssemblyQualifiedName);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.