gpt4 book ai didi

c# - 在 NHibernate 中审核多对多关系

转载 作者:太空狗 更新时间:2023-10-29 21:36:32 24 4
gpt4 key购买 nike

我已经使用 IPreUpdateEventListenerIPreInsertEventListener 实现了监听器来审核对我的应用程序中表的更改,除了我的多对多关系之外,一切正常连接表中的附加数据(即我没有用于连接表的 POCO)。

每个可审计对象都实现了一个IAuditable 接口(interface),因此事件监听器会检查 POCO 是否属于 IAuditable 类型,如果是,它会记录对目的。查找表实现了一个 IAuditableProperty 接口(interface),因此如果 IAuditable POCO 的一个属性指向一个查找表,更改将记录在主 POCO 的日志中。

那么,问题是,我应该如何确定我正在处理多对多集合并将更改记录到我的审计表中?

编辑:我正在使用 NHibernate 2.1.2.4000

//first two checks for LastUpdated and LastUpdatedBy ommitted for brevity
else if (newState[i] is IAuditable)
{
//Do nothing, these will record themselves separately
}
else if (!(newState[i] is IAuditableProperty) && (newState[i] is IList<object> || newState[i] is ISet))
{
//Do nothing, this is a collection and individual items will update themselves if they are auditable
//I believe this is where my many-to-many values are being lost
}
else if (!isUpdateEvent || !Equals(oldState[i], newState[i]))//Record only modified fields when updating
{
changes.Append(preDatabaseEvent.Persister.PropertyNames[i])
.Append(": ");
if (newState[i] is IAuditableProperty)
{
//Record changes to values in lookup tables
if (isUpdateEvent)
{
changes.Append(((IAuditableProperty)oldState[i]).AuditPropertyValue)
.Append(" => ");
}
changes.Append(((IAuditableProperty)newState[i]).AuditPropertyValue);
}
else
{
//Record changes for primitive values
if(isUpdateEvent)
{
changes.Append(oldState[i])
.Append(" => ");
}
changes.Append(newState[i]);
}
changes.AppendLine();
}

最佳答案

这不会触发的原因是因为集合没有改变,即它们仍然是之前存在的 ICollection 的同一个实例,但是集合的内容已经改变。

我自己找过,事件监听器不处理这种情况。这可能已为 v3.0 修复(但不要引用我的话)。有几个不理想的解决方法:

1) 在对象上放置一个属性,该属性以字符串形式表示集合以供审计。

2)使集合中的项目实现接口(interface),以便单独审核它们。

编辑:还有第三种选择:

“而不是多对多,我有一个多对一的连接表,然后一对多从它进入属性表。我把连接表 POCO 隐藏在后面多对多连接的每一端的逻辑,但仍然必须实现对象及其上的所有接口(interface)。”

关于c# - 在 NHibernate 中审核多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4527135/

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