gpt4 book ai didi

NHibernate PocoEntityTuplizer 正在将实体设置为 "dirty"。我该如何阻止?

转载 作者:行者123 更新时间:2023-12-01 05:36:51 24 4
gpt4 key购买 nike

我的数据库中的一些对象使用 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);
}
}

最佳答案

您可以尝试这样的代码来重置实体,以便 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];
}
}

关于NHibernate PocoEntityTuplizer 正在将实体设置为 "dirty"。我该如何阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8129767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com