【发布时间】:2016-06-11 00:08:49
【问题描述】:
我使用 nhibernate 拦截器来比较实体属性的旧状态和当前状态的值,但其中一些属性的类型为 ICollection,所以任何人都可以指导我如何检查对象是否为 @ 类型987654322@
这是我的代码
public void OnPostUpdate(NHibernate.Event.PostUpdateEvent @event)
{
var entityToAudit = @event.Entity as IAuditable;
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AuditLog.txt");
using (StreamWriter sw = File.AppendText(path))
{
for (int i = 0; i < @event.OldState.Length; i++)
{
string propertyName = @event.Persister.PropertyNames[i];
if (@event.OldState[i] != null)
{
if (!@event.OldState[i].Equals(@event.State[i]))
{
sw.WriteLine("the value of "+ propertyName + " has been changed from " + @event.OldState[i] + " to " + @event.State[i]);
}
}
else
{
if (@event.State[i] != null)
{
sw.WriteLine("the value of "+ propertyName + " has been changed from being empty to " + @event.State[i]);
}
}
}
}
}
【问题讨论】:
-
无论如何,集合都有自己的“先前”状态跟踪。 (通常)只有一个集合的实例,所以你不能那么容易地比较它。顺便说一句,在 OnPostUpdate 触发器中写入文件时,我不会有好的感觉。除了非常糟糕的性能之外,想象一下循环文件锁和数据库锁可能会导致非常讨厌的死锁。
标签: c# nhibernate reflection fluent-nhibernate icollection