Nhibernate, 0 in foreign key column

I got an obsolete database where the value 0 was used in the FK columns to indicate that no relationship was specified.

This is not something that I can change trivially. Is it possible to tell NHibernate to treat 0 as null in the specified columns?

Edit

I know about not-found , but I just want to ignore those who have 0.

+4
source share
2 answers

This solution is perfect for us: http://nhibernate.info/blog/2011/01/28/how-to-use-0-instead-of-null-for-foreign-keys.html

In short:

Add the following class:

 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); } } 

Then register it for each relevant display:

 foreach (var persistentClass in configuration.ClassMappings) { persistentClass.AddTuplizer(EntityMode.Poco, typeof(NullableTuplizer).AssemblyQualifiedName); } 
0
source

There is a similar question: NHibernate Saving 0 in a many-in-one column instead of zero . There is an interesting, but a little strange decision by Noel Kennedy.

I would probably save the record with id 0 in the database representing the null object.

0
source

Source: https://habr.com/ru/post/1336713/


All Articles