我正在尝试为我的 ASP.NET Web 应用程序设置 Nhibernate Envers。我正在使用 Fluent Nhibernate 并且有一个像下面这样的实体。我希望 Envers 使用该表audUsers
进行审计,但它一直坚持使用tblUsers_AUD
.
实体
[AuditTable("audUsers")]
public class User
{
public virtual string Name {get; set;}
public virtual string EmailAddress {get; set;}
}
映射
public class UserMapping : ClassMap<User>
{
public UserMapping()
{
Map(m => m.Name).Not.Nullable();
Map(m => m.EmailAddress).Not.Nullable();
}
}
休眠配置
public static ISessionFactory BuildSessionFactory<T>() where T : ICurrentSessionContext
{
var connectionString = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
return Fluently
.Configure()
.Database(OracleDataClientConfiguration.Oracle10.ConnectionString(connectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<NHibernateConfiguration>()
.Conventions.AddFromAssemblyOf<TableNameConvention>())
.CurrentSessionContext<T>()
.ExposeConfiguration(ConfigureEnvers)
.BuildSessionFactory();
}
private static void ConfigureEnvers(NHibernate.Cfg.Configuration nhConf)
{
var enversConf = new NHibernate.Envers.Configuration.Fluent.FluentConfiguration();
enversConf.Audit<User>();
nhConf.IntegrateWithEnvers(enversConf);
}
而且,以防万一我设置的 nHibernate 约定很重要:
休眠约定
public class TableNameConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
instance.Table(string.Format("tbl{0}s", instance.EntityType.Name));
}
}
我遇到的问题是 User 实体上的 AuditTable 属性实际上似乎没有做任何事情。Envers 仍然只是使用默认的审计表命名sticking 和_aud 后缀。我已经能够成功地配置它来更改前缀或后缀,但我真的宁愿完全更改名称,主要是由于 Oracle 强加的表名字符限制。否则,当附加前缀或后缀时,我会遇到字符限制过长的表名问题。