NHibernate PocoEntityTuplizer正在将实体设置为;肮脏的”;。我该怎么阻止这一切?
数据库中的某些对象将0用于不存在的关系。 所以我设置了一个NullableTuplizer类。我在网上找到了这个的代码。 到目前为止,它一直有效,但我注意到一个问题。在被选中后,实体立即变脏,这一直是我们面临的主要问题。因此,在对该对象执行Get()操作后,它会立即变脏,NHibernate会尝试将其保存到数据库中 我正在努力防止这些“映射问题”。有人知道如何让它知道它真的不脏吗NHibernate PocoEntityTuplizer正在将实体设置为;肮脏的”;。我该怎么阻止这一切?,nhibernate,dirtyread,Nhibernate,Dirtyread,数据库中的某些对象将0用于不存在的关系。 所以我设置了一个NullableTuplizer类。我在网上找到了这个的代码。 到目前为止,它一直有效,但我注意到一个问题。在被选中后,实体立即变脏,这一直是我们面临的主要问题。因此,在对该对象执行Get()操作后,它会立即变脏,NHibernate会尝试将其保存到数据库中 我正在努力防止这些“映射问题”。有人知道如何让它知道它真的不脏吗 public class NullableTuplizer : PocoEntityTuplizer { p
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);
}
}
公共类NullableTuplizer:PocoEntityTuplizer
{
公共NullableTuplizer(EntityMetamodel EntityMetamodel,PersistentClass MapPedenty)
:基础(entityMetamodel、MapPedenty)
{
}
公共重写对象[]GetPropertyValuesToInsert(
对象实体、IDictionary合并映射、ISessionImplementor会话)
{
object[]values=base.GetPropertyValuesToInsert(实体、合并映射、会话);
//肮脏黑客1
for(int i=0;i
您可以尝试这样的代码来重置实体,使NH认为它没有更改:
public static void Reset(this ISession session, Object entity)
{
var sessionImpl = session.GetSessionImplementation();
var context = sessionImpl.PersistenceContext;
var entry = context.GetEntry(context.Unproxy(entity));
if ((entry == null) || (entry.RequiresDirtyCheck(entity) == false) || (entry.ExistsInDatabase == false) || (entry.LoadedState == null))
{
return;
}
var persister = entry.Persister;
var currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode);
var loadedState = entry.LoadedState;
for (var 0; i < currentState.Length; ++i)
{
loadedState[i] = currentState[i];
}
}
公共静态无效重置(此ISession会话,对象实体)
{
var sessionImpl=session.GetSessionImplementation();
var context=sessionImpl.PersistenceContext;
var entry=context.GetEntry(context.Unproxy(entity));
if((entry==null)| |(entry.requiresdiretycheck(entity)==false)| |(entry.ExistsInDatabase==false)| |(entry.LoadedState==null))
{
返回;
}
var persister=entry.persister;
var currentState=persister.getPropertyValue(实体,sessionImpl.EntityMode);
var loadedState=entry.loadedState;
对于(变量0;i