2011-01-23 1 views
4

У меня есть устаревшая база данных, где значение 0 было использовано в столбцах FK, чтобы указать, что никакого отношения не указано.nhibernate, 0 в столбце внешнего ключа

Это не то, что я могу изменить тривиально. Можно ли сообщить NHibernate обрабатывать 0 как null в указанных столбцах?

Редактировать

Я знаю о not-found, но я просто хочу, чтобы игнорировать те с 0.

+0

Можете ли вы добавить отношение wi th a PK из 0 в таблицы, ссылки на FK? – Mark

+0

Нет, я не могу. Весь код ожидает, что модель будет содержать null, если нет отношения. – jgauffin

ответ

0

Это решение работало большое для нас: 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); 
} 
+0

Указанная вами ссылка не работает. – jkyadav

0

Существует аналогичный вопрос: NHibernate Saving 0 to many-to-one column instead of null. Есть интересное, но немного странное решение Ноэля Кеннеди.

Я бы, вероятно, сохранил запись с идентификатором 0 в базе данных, которая представляет собой нулевой объект.