NHibernate-如何在postinsert事件中获取链接实体值以用于审核日志记录
当使用事件监听器实现审计日志记录时,如何在nhibernate中获取链接实体(外键)值。 我能够记录除链接实体之外的所有实体属性,链接实体只记录链接实体的名称而不是值 如果有人能给我指出正确的方向或提供示例代码,那就太好了。 这是我目前拥有的NHibernate-如何在postinsert事件中获取链接实体值以用于审核日志记录,nhibernate,logging,event-listener,audit,Nhibernate,Logging,Event Listener,Audit,当使用事件监听器实现审计日志记录时,如何在nhibernate中获取链接实体(外键)值。 我能够记录除链接实体之外的所有实体属性,链接实体只记录链接实体的名称而不是值 如果有人能给我指出正确的方向或提供示例代码,那就太好了。 这是我目前拥有的 public void OnPostInsert(PostInsertEvent @event) { if (@event.Entity is AuditLog) { return;
public void OnPostInsert(PostInsertEvent @event)
{
if (@event.Entity is AuditLog)
{
return;
}
ISession session = @event.Session.GetSession(EntityMode.Poco);
string username = httpContextHelper.GetCurrentUsersLoginName();
var props = @event.State;
for (int i = 0; i < props.Length; i++)
{
string newValue = string.Empty;
//Tried this but obj always null............
//var obj = props[i] as INHibernateProxy;
//if (obj != null)
//{
// newValue = obj.HibernateLazyInitializer.Identifier.ToString();
// session.Evict(props[i]);
//}
newValue = (props[i] == null) ? string.Empty : props[i].ToString();
if (props[i] != null)
{
session.Save(new AuditLog
{
AuditEntryType = "Insert",
DomainFullName = @event.Entity.GetType().FullName,
DomainShortName = @event.Entity.GetType().Name,
OldValue = string.Empty,
FieldName = @event.Persister.PropertyNames[i],
NewValue = newValue,
DomainId = (int)@event.Id,
Timestamp = DateTime.Now,
Username = username
});
}
}
}
public void OnPostInsert(PostInsertEvent@event)
{
如果(@event.Entity是AuditLog)
{
返回;
}
ISession session=@event.session.GetSession(EntityMode.Poco);
字符串username=httpContextHelper.GetCurrentUsersLoginName();
var props=@event.State;
for(int i=0;i
为什么不在@event.Entity中按名称获取属性值。我不确定名称在hibernate中的位置,因为在nhibernate(c#)中选中我的src是一个名为propertyNames的参数,我可以使用反射来获取它们。为什么不在@event.Entity中按名称获取属性值呢。我不确定名称在hibernate中的位置,因为在nhibernate(c#)中选中我的src是一个名为propertyNames的参数,我可以使用反射获取它们。您的链接对象属性是引用链接对象本身还是引用ID值
如果您的属性是链接对象,那么您的方法只需调用链接对象上的.ToString()方法,默认情况下,该方法是类名。如果您是从下面的示例中记录日志,那么Author将只是类名,如“MyNamespace.Author”,或者重写.ToString()时输出的任何名称
您有多种选择:
- 添加另一个具有外部ID的属性,例如“int AuthorID”,并将其映射到FK列
- 使用.ToString()实现,该实现允许您标识相关对象(仅人类可读)
- 获取对象的ID,如“blogToLog.Author.ID”。这有一些缺点:在日志记录例程中需要一个特殊情况,日志记录可能会调用相关对象上的延迟加载(意思是:仅为日志记录而从数据库加载),如果尚未加载的话
- 创建一个具有ID属性的接口,让所有持久类实现它,如果属性是类类型,则将其强制转换并输出ID
- 添加另一个具有外部ID的属性,例如“int AuthorID”,并将其映射到FK列
- 使用.ToString()实现,该实现允许您标识相关对象(仅人类可读)
- 获取对象的ID,如“blogToLog.Author.ID”。这有一些缺点:在日志记录例程中需要一个特殊情况,日志记录可能会调用相关对象上的延迟加载(意思是:仅为日志记录而从数据库加载),如果尚未加载的话
- 创建一个具有ID属性的接口,让所有持久类实现它,如果属性是类类型,则将其强制转换并输出ID
public class Blog
{
public virtual int ID {get;set;}
public virtual string Name {get;set;}
public virtual Author Author {get;set;}
// more properties
}
public class Author
{
public virtual int ID {get;set;}
public virtual string Name {get;set;}
public virtual DateTime Birthday {get;set;}
}
// property design as used with XML mappings