2

我正在尝试为我的 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 强加的表名字符限制。否则,当附加前缀或后缀时,我会遇到字符限制过长的表名问题。

4

1 回答 1

2

NHibernate.Envers 支持两种配置,使用属性或在代码中配置 - 你不能混合使用这些。在您的 nhCfg.IntegrateWithEnvers 中,您传入您的 Envers 配置。此对象可以是 FluentConfiguration 或 AttributeConfiguration 对象。

您正在使用 FluentConfiguration,这意味着您的配置是在这个对象上的代码中进行的 - Envers 属性被忽略。

FluentConfiguration 的 AuditTable 属性的对应部分是

var enversCfg = new FluentConfiguration();
enversCfg.Audit<User>()
   .SetTableInfo(table => table.Value = "audUsers");
于 2012-11-27T15:37:17.087 回答