nhibernate, 0 в столбце иностранного ключа
-
23-10-2019 - |
Вопрос
Я получил устаревшую базу данных, где значение 0 использовалось в столбцах FK, чтобы указать, что никаких отношений не было указано.
Это не то, что я могу изменить тривиальным образом. Можно ли сказать nhibernate обработать 0 как нулевое в указанных столбцах?
Редактировать
Я знаю о not-found
, но я просто хочу игнорировать тех, у кого 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);
}
Другие советы
Есть аналогичный вопрос: Nhibernate saving 0 в колонке с множеством к одному вместо нулевого. Анкет Есть интересное, но немного странное решение Ноэля Кеннеди.
Я бы, вероятно, сохранил бы запись с идентификатором 0 в базе данных, которая представляет нулевой объект.