我数据库中的一些对象使用 0 表示不存在的关系。所以我设置了一个 NullableTuplizer 类。我在网上找到了这个的代码。到目前为止它一直有效,但我注意到一个问题。我们一直遇到重大问题,即实体在被选中后立即变脏。因此,在对这个对象执行 Get() 之后,它的脏值和 NHibernate 会立即尝试将其保存到数据库中。
我试图防止这些“映射问题”。有谁知道如何让它知道它真的不脏?
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(BaseEntity).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(BaseEntity).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++)
{
dynamic val = values[i];
if (typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType) && val.Id == 0)
{
values[i] = null;
}
}
base.SetPropertyValues(entity, values);
}
}