我正在尝试为我的ASP.NET网络应用程序设置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强加的表名字符限制。否则,当附加前缀或后缀时,我会遇到与正好与字符限制太长的表名有关的问题。
答案 0 :(得分:2)
NHibernate.Envers支持两种配置,使用属性或在代码中配置 - 您不能混用这些配置。在你的nhCfg.IntegrateWithEnvers中传入你的Envers配置。该对象可以是FluentConfiguration或AttributeConfiguration对象。
您正在使用FluentConfiguration,这意味着您的配置是在此对象的代码中进行的 - 将忽略Envers属性。
FluentConfiguration的AuditTable属性的计数器部分是
var enversCfg = new FluentConfiguration();
enversCfg.Audit<User>()
.SetTableInfo(table => table.Value = "audUsers");