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 は、属性を使用するか、コードで構成するかの 2 種類の構成をサポートします。これらを混在させることはできません。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 に答える