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); }
Jesse source share