Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate-如何在postinsert事件中获取链接实体值以用于审核日志记录_Nhibernate_Logging_Event Listener_Audit - Fatal编程技术网

NHibernate-如何在postinsert事件中获取链接实体值以用于审核日志记录

NHibernate-如何在postinsert事件中获取链接实体值以用于审核日志记录,nhibernate,logging,event-listener,audit,Nhibernate,Logging,Event Listener,Audit,当使用事件监听器实现审计日志记录时,如何在nhibernate中获取链接实体(外键)值。 我能够记录除链接实体之外的所有实体属性,链接实体只记录链接实体的名称而不是值 如果有人能给我指出正确的方向或提供示例代码,那就太好了。 这是我目前拥有的 public void OnPostInsert(PostInsertEvent @event) { if (@event.Entity is AuditLog) { return;

当使用事件监听器实现审计日志记录时,如何在nhibernate中获取链接实体(外键)值。 我能够记录除链接实体之外的所有实体属性,链接实体只记录链接实体的名称而不是值

如果有人能给我指出正确的方向或提供示例代码,那就太好了。 这是我目前拥有的

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值

如果您的属性是链接对象,那么您的方法只需调用链接对象上的.ToString()方法,默认情况下,该方法是类名。如果您是从下面的示例中记录日志,那么Author将只是类名,如“MyNamespace.Author”,或者重写.ToString()时输出的任何名称

您有多种选择:

  • 添加另一个具有外部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