如何使AuditTable属性起作用?

时间:2012-11-27 14:53:14

标签: c# fluent-nhibernate hibernate-envers

我正在尝试为我的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();
    }
}

Nhibernate配置

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约定很重要:

Nhibernate Conventions

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强加的表名字符限制。否则,当附加前缀或后缀时,我会遇到与正好与字符限制太长的表名有关的问题。

1 个答案:

答案 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");