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によって課されたテーブル名の文字制限のために、名前を完全に変更したいと思います。そうしないと、接頭辞または接尾辞を付けると文字数制限に反するテーブル名が長すぎるという問題が発生します。