首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用NHibernate实现ChangeTime和ChangeUser列?

要使用NHibernate实现ChangeTime和ChangeUser列,您需要遵循以下步骤:

  1. 创建实体类:首先,您需要创建一个实体类,该类具有ChangeTime和ChangeUser列。例如:
代码语言:csharp
复制
public class MyEntity
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual DateTime ChangeTime { get; set; }
    public virtual string ChangeUser { get; set; }
}
  1. 配置映射:接下来,您需要在NHibernate的映射配置文件中为实体类添加映射。例如:
代码语言:xml<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyNamespace">
复制
 <class name="MyEntity" table="MyEntity">
    <id name="Id" column="Id">
     <generator class="identity" />
    </id>
   <property name="Name" column="Name" />
   <property name="ChangeTime" column="ChangeTime" />
   <property name="ChangeUser" column="ChangeUser" />
  </class>
</hibernate-mapping>
  1. 实现审计功能:要实现ChangeTime和ChangeUser列的自动填充,您需要在NHibernate的事件监听器中实现审计功能。例如:
代码语言:csharp
复制
public class AuditEventListener : IPreUpdateEventListener, IPreInsertEventListener
{
    public bool OnPreUpdate(PreUpdateEvent @event)
    {
        SetChangeTimeAndUser(@event.Persister, @event.State, @event.Session);
        return false;
    }

    public bool OnPreInsert(PreInsertEvent @event)
    {
        SetChangeTimeAndUser(@event.Persister, @event.State, @event.Session);
        return false;
    }

    private void SetChangeTimeAndUser(IEntityPersister persister, object[] state, ISession session)
    {
        int changeTimeIndex = Array.IndexOf(persister.PropertyNames, "ChangeTime");
        int changeUserIndex = Array.IndexOf(persister.PropertyNames, "ChangeUser");

        if (changeTimeIndex >= 0)
        {
            state[changeTimeIndex] = DateTime.UtcNow;
        }

        if (changeUserIndex >= 0)
        {
            state[changeUserIndex] = session.SessionFactory.CurrentSessionContext.Session.GetSessionImplementation().Connection.ConnectionString;
        }
    }
}
  1. 注册事件监听器:最后,您需要在NHibernate的配置中注册事件监听器。例如:
代码语言:csharp
复制
var configuration = new Configuration();
configuration.Configure();
configuration.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { new AuditEventListener() };
configuration.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] { new AuditEventListener() };

现在,每当您使用NHibernate插入或更新MyEntity实例时,ChangeTime和ChangeUser列将自动填充。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用VS2015Nhibernate实现与MySql数据库连接,实现增删改查操作

本文链接:https://blog.csdn.net/CJB_King/article/details/53456282 准备工具:VS2015(版本不限) ,Nhibernate包,MySql...,MySQL-FRONT ,Connector/Net(选择.Net&Mono) Nhibernate包可以在VS2015中下载 ,对MySql操作,我用的是MySQL-FRONT,注意要想实现和数据库的链接...嗯,如果能够运行成功,说明我们的步骤都是正确的,这就是一个简单的测试,测试成功,说明我们的VS与MySql数据连接是没有任何问题的,只要把该引入的都引入了就不会报什么异常错误之类的,接下来将用C#代码Nhibernate...包来实现一个很简单的对数据增删改查的操作,这一次需要用到我们之前下载的Nhibernate包里面的文件,全部dll文件引入之后,“引用”下面应该是这样的: ?...帮助类,使用Nhibernate连接数据库,用来得到sessionFactory,然后使用sessionFactory里面的session去操作数据库,代码如下: using System; using

1.4K30

使用Pandas实现1-6分别第0比大小得较小值

一、前言 前几天在Python白银交流群【星辰】问了一个pandas处理Excel数据的问题,提问截图如下: 下图是他的原始代码截图: 二、实现过程 其实他这个代码,已经算实现了,如果分别进行定义的话...,每一做一个变量接收,也是可以实现效果的,速度上虽然慢一些,但是确实可行。...cell_file.xlsx") for i in range(1, 4): df[f'min{i}'] = df[['标准数据', f'测试{i}']].min(axis=1) print(df) 看上去确实是实现了多比较的效果...当然这里取巧了,使用了字符串格式化。 三、总结 大家好,我是皮皮。这篇文章主要盘点了一个Pandas处理的问题,文中针对该问题,给出了具体的解析代码实现,帮助粉丝顺利解决了问题。...最后感谢粉丝【星辰】提问,感谢【dcpeng】给出的思路代码解析,感谢【Jun】、【瑜亮老师】等人参与学习交流。

1.2K20
  • 栈 | 如何使用数组链表实现“栈”

    下面是一个栈的入栈出栈整个过程 [n0po5i62v6.png] 栈的实现有两种方法,分别为采用数组来实现采用链表来实现。下面分别详细介绍这两种方法。...代码实现 /** * 数组使用栈 * * @author tian * @date 2020/4/26 */ public class MyStackDemo { public static...分析 在创建链表的时候经常采用一种从头结点插入新结点的方法,可以采用这种方法来实现栈,最好使用带头结点的链表,这样可以保证对每个结点的操作都是相同的,实现思路如下图所示。...[for51mbb9n.png] 在上图中,在进行压栈操作时,首先需要创建新的结点,把待压栈的元素放到新结点的数据域中,然后只需要(1)(2)两步就实现了压栈操作(把新结点加到了链表首部)。...采用链表实现栈的优点:使用灵活方便,只有在需要的时候才会申请空间。它的缺点:除了要存储元素外,还需要额外的存储空间存储指针信息。 算法性能分析:这两种方法压栈与弹栈的时间复杂度都为O(1)。

    1.1K40

    如何使用RabbitMQPython实现广播消息

    使用 RabbitMQ Python 实现广播消息的过程涉及设置一个消息队列多个消费者,以便接收相同的消息。RabbitMQ 的 "fanout" 交换机允许你将消息广播到所有绑定的队列。...以下是如何实现这一过程的详细步骤。1、问题背景在将系统从Morbid迁移到RabbitMQ时,发现RabbitMQ无法提供Morbid默认提供的广播行为。...2、解决方案使用交换机队列来实现广播消息。具体方法如下:(1)使用amqplib库来创建交换机队列。在发送消息时,将消息发送到交换机,而不是队列。...subscribe to the queueconn.subscribe(destination=qname, ack='auto')​while True: passconn.disconnect()(2)使用...StompJS 库来实现广播消息。

    6510

    如何使用Java实现工厂模式抽象工厂?

    下面以一个简单的示例来演示如何使用Java实现工厂模式。...4、具体产品(Concrete Product):实现了抽象产品接口的具体类。 下面以一个简单的示例来演示如何使用Java实现抽象工厂。...在 AbstractFactoryPatternExample类中,我们使用具体工厂1创建了产品A1产品B1,使用具体工厂2创建了产品A2产品B2。...抽象工厂模式使得客户端代码与具体产品的实现相分离,客户端只需要使用抽象接口抽象工厂来创建产品。这种设计使得系统更具有灵活性,可以方便地切换不同的产品组合。...工厂模式抽象工厂都是用于对象的创建过程,通过封装抽象来解耦客户端代码与具体产品的实现。工厂模式适用于单个产品族的情况,而抽象工厂适用于多个相关产品族的情况。

    12110

    如何使用FlexboxCSS Grid,实现高效布局

    虽然 Flexbox CSS Grid 可以完成类似的布局,但是本次,我们学习的是如何组合使用这两个工具,而不是只选择其中的一个。...主内容区域应该是侧边栏大小的三倍,使用 Flexbox 很容易实现这点。...将 grid-template-columns 设置为 1fr 1fr。这样 header 中就有两个相同大小的,放置导航项按钮会很合适。...基本的布局如下图所示: 这种布局需要在行两个方向上保持一致,所以使用 CSS Grid 实现整体布局十分有效。 规划对于布局的实现来说,十分重要。 接下来看看代码如何一步步实现。...对于网格内容区域的设计,使用 Flexbox 进行样式的排序微调会更容易实现

    3.5K10

    队列 | 如何使用数组链表来实现“队列”

    如何使用数组链表来实现“队列” 与栈一样,队列(Queue)也是一种数据结构,它包含一系列元素。但是,队列访问元素的顺序不是后进先出(LIFO),而是先进先出(FIFO)。 ? ?...实现一个队列的数据结构,使其具有入队列、出队列、查看队列首尾元素、查看队列大小等功能。与实现栈的方法类似,队列的实现也有两种方法,分别为采用数组来实现采用链表来实现。下面分别详细介绍这两种方法。...OK,自此,使用数组实现队列已经搞定。 问题 出队列后数组前半部分的空间不能够充分地利用,解决这个问题的方法为把数组看成一个环状的空间(循环队列)。...在上图中,刚开始队列中只有元素1、23,当新元素4要进队列的时候,只需要上图中(1)(2)两步,就可以把新结点连接到链表的尾部,同时修改pEnd指针指向新增加的结点。...OK,使用链表实现队列到此就搞定。 总结 显然用链表来实现队列有更好的灵活性,与数组的实现方法相比,它多了用来存储结点关系的指针空间。

    1.6K20

    如何使用Java实现队列的操作?

    使用Java实现栈(Stack)队列(Queue)的操作是很常见的任务。栈队列是两种不同的数据结构,它们分别具有特定的操作和行为。下面将详细介绍如何使用Java实现队列的基本操作。...以下是栈的基本操作: 1、创建栈:我们可以使用Java的集合类Stack或者自定义一个栈类来实现栈的操作。...表达式求值:计算机编译器和解释器在求解表达式时会使用栈来保存操作数运算符。 撤销操作:编辑器设计软件通常使用栈来实现撤销重做的功能。...消息队列:分布式系统中,消息队列用于实现不同组件之间的高效通信和解耦。 四、栈队列的复杂度分析 栈队列的操作复杂度与其实现方式有关。...需要注意的是,上述复杂度是基于常规实现方式的情况下给出的。 通过使用Java的内置类或自定义类,我们可以轻松实现队列的基本操作。栈队列是常见的数据结构,它们在编程中有广泛的应用场景。

    20810

    如何使用Pulsar实现数据过滤安全通信

    关于Pulsar  Pulsar是一款针对数据通信安全的强大工具,该工具可以帮助广大研究人员实现数据过滤安全(隐蔽)通信,并通过使用各种不同的协议来创建安全的数据传输聊天隧道。...接下来,使用下列命令将该项目代码克隆至本地,并构建Pulsar项目代码: $ cd pulsar $ export GOPATH=$(shell pwd) $ go get golang.org...在数据连接器的帮助下,我们可以使用Pulsar并从不同的数据源读取或写入数据。 命令行终端 默认的数据出入连接器,支持通过STDIN读取数据,通过STDOUT写入数据。...  数据处理器将允许我们在数据的传输过程中修改数据,我们也可以任意选择组合使用数据处理器。...--decode选项来使用所有数据处理器的解码模式: --handlers base64,base32,base64,cipher:key --decode  工具使用样例  在下列演示样例中,我们将使用

    1.2K20

    如何使用 session cookie 实现用户认证

    为什么我们要讨论 Session Cookie?想象一下,我们日常使用的具有“会员登录”或者“网上购物”功能的网站,服务器需要识别这些不同的请求是否来自同一个客户端。...因此,开发者需要利用 Session Cookie 机制来帮助服务器识别特定的客户端。餐馆顾客在讨论技术内容之前,我们先来聊聊你附近的餐馆。...餐馆消费者的关系就像 Session Cookie 一样。你每次去餐馆消费都是独立的事件,交易完成后,老板通常不会记得你上次点了什么。...Session 与 Cookie 如何运作?我们通过用户登录的案例来进一步讨论这两者是如何运作的。开发者会使用 session 与 cookie 来实现用户认证系统。...我们把登录这个动作拆分成“如何登录”“登录后发生了什么”来讨论。用户如何登录?

    5400

    如何使用Nginx实现反向代理端口转发?

    Nginx是一款性能卓越的高性能Web服务器反向代理服务器,其在应用场景互联网领域中有着广泛的应用。本文将重点介绍如何使用Nginx实现反向代理端口转发。图片1....反向代理通常用于隐藏服务端的真实IP地址,提高系统的安全性稳定性。同时,反向代理还可以实现负载均衡、缓存加速等功能。...1.2 使用Nginx实现反向代理使用Nginx实现反向代理非常简单,只需要在Nginx配置文件中添加以下配置项:http { server { listen 80;...2.2 使用Nginx实现端口转发使用Nginx实现端口转发也非常简单,只需要在Nginx配置文件中添加以下配置项:http { server { listen 80;...总结本文介绍了使用Nginx实现反向代理端口转发的方法。通过上述的介绍,我们可以了解到反向代理端口转发的概念及其应用场景,以及如何使用Nginx来实现这些功能。

    16.4K10

    如何使用Java实现线程池任务调度?

    Java提供了丰富的API来实现线程池任务调度功能,下面将介绍如何使用Java实现线程池任务调度,并探讨其在实际应用中的作用。 一、线程池的实现 线程池是一种可重复利用的线程资源管理机制。...Java中的线程池可以使用ThreadPoolExecutor类来实现。下面将介绍线程池的主要组成部分及其实现方法。...任务队列(Work Queue):保存待执行的任务,一般使用阻塞队列来实现,常用的有ArrayBlockingQueue、LinkedBlockingQueue等。...二、任务调度的实现 任务调度是指按照一定的规则条件对任务进行安排执行的过程。...通过使用Java中的线程池任务调度器,我们可以更好地管理线程资源,并可以按照一定规则条件对任务进行安排执行。线程池任务调度功能在并发编程中应用广泛,能够提高程序的性能效率。

    19310

    如何使用Fluent Nhibernate中的Automapping进行OR Mapping映射

    由于在项目中使用NHibernate来作为ORMapping构建数据访问层,那么就必须要配置ObjectDataTable的映射。...,我们使用了Fluent NHibernate的Mapping方式代替XML配置。...使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#来编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。...比如我们可以定义如下的规则: 类名字段名采用每个单词首字母大写的方式而数据库表名列名使用全部大写,单词之间下划线分割的方式。...(比如CostCenter中有public virtual long Id{get;set;},对应表中的COST_CENTER_ID) 对于一对多的关系,使用父方的类名作为属性名,表中使用父表的主键列名作为对应的外键的列名

    1.1K10

    如何使用Java实现线程间的通信同步?

    使用Java实现线程间的通信同步是多线程编程中非常重要的一部分。在Java中,可以通过以下几种方式实现线程间的通信同步:使用共享对象、使用管道流、使用信号量、使用条件等待。...一、使用共享对象: 共享对象是多个线程之间共享的数据结构或容器,在多线程环境下,可以通过对共享对象进行加锁来实现线程间的同步通信。Java中常用的共享对象包括互斥锁、信号量、条件变量等。...二、使用管道流: Java提供了PipedInputStreamPipedOutputStream来实现线程间的通信。...通过Lock接口的实现类ReentrantLock可以实现线程间的同步通信,通过Condition接口的实现实现线程间的等待唤醒。...以上是使用Java实现线程间的通信同步的几种方式,包括使用共享对象、管道流、信号量、锁条件等待等。每种方式都有不同的适用场景,选择合适的方式可以提供更好的性能可维护性。

    17410

    如何使用Speakeasy实现Windows内核用户模式仿真

    Speakeasy模拟的是Windows的特定组件,而不是尝试使用整个虚拟化操作系统执行动态分析。...具体地说,Speakeasy可以通过模拟操作系统API、对象、正在运行的进程/线程、文件系统网络,给研究人员提供一个能够让待分析样本完整执行的环境。...当前版本的Speakeasy支持用户模式内核模式Windows应用程序。 在进行模拟之前,工具会识别代码中的入口点,而且还可以模拟在运行时所发现的动态入口点。...Docker镜像构建 首先,我们需要使用下列命令创建一个容器,标签名为“my_tag”: cd docker build -t "my_tag" ...." 工具使用 以代码库运行 下面的例子中,我们演示了如何模拟一个Windows DLL: import speakeasy # Get a speakeasy object se = speakeasy.Speakeasy

    88930

    NHibernate的单表继承模式下通过父类Repository查询子类

    .html)介绍了有3种常用的实现方式: Concrete Table Inheritance(具体表继承) Single Table Inheritance(单表继承) Class Table Inheritance...其缺点就是一个数据表的比较多,而且很多列为空,不过现代的数据库对空的压缩处理已经比较好了,不会产生大量空造成的性能问题磁盘空间的浪费。...在NHibernate中经常会遇到通过父类的Repository来查询子类的情况,比如现在有一个抽象的Employee对象,下面有OfficeUserTeacher两个具体的对象,这两个对象都有其特有的属性...我们可以将OfficeUserTeacher都保存到Employee表中,然后建立了一个EmployeeRepository,使用Employee作为Query的入口,那么如果要查询Employee表中所有的...a =>a.GetType() == typeof (Teacher)).List(); 这里需要注意的是,条件中使用的是a.GetType()==typeof(Teacher),但是不能使用a is

    35120
    领券