Fluent NHibernate 自動マッピングを使用しようとしている既存のデータベースがあります。多くのテーブルには監査列があるため、多くのエンティティが次のような単純な抽象クラスを継承するのが妥当だと思いました。
public abstract class AuditableEntity
{
public virtual string CreatedBy { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual string ModifiedBy { get; set; }
public virtual DateTime ModifiedOn { get; set; }
}
これらの値はデータベースに設定されているため、問題が発生します。これらの値を設定せずに新しいエンティティを挿入しようとするとSqlTypeException : SqlDateTime overflow
、値の型であるため、が にDateTime
初期化されDateTime.MinValue
ます。
これを修正するために私がやろうとしたことは、次のような自動マッピングのオーバーライドを追加することでした:
public class AuditableEntityOverride : IAutoMappingOverride<AuditableEntity>
{
public void Override(AutoMapping<AuditableEntity> mapping)
{
mapping.Map(x => x.CreatedBy).Generated.Insert();
mapping.Map(x => x.CreatedOn).Generated.Insert();
mapping.Map(x => x.ModifiedBy).Generated.Always();
mapping.Map(x => x.ModifiedOn).Generated.Always();
}
}
ただし、これは実際には何もしません。
監査列を継承する各エンティティのマッピングを明示的にオーバーライドすることで問題を解決できますが、これは非常に多くのエンティティであり、Fluent NHibernate にここでの作業のほとんどを行わせようとしています。
このマッピングをすべてのサブクラスに適用するためにできることはありますか?
アップデート
役立つ場合は、これがセッション ファクトリの作成方法です。たぶん、ここにも欠けているものがあります:
var sessionFactory = Fluently.Configure(new Configuration().AddProperties(new Dictionary<string, string>
{
{Environment.ConnectionDriver,typeof (SqlClientDriver).FullName},
{Environment.Dialect,typeof (MsSql2008Dialect).FullName},
{Environment.ConnectionProvider,typeof (DriverConnectionProvider).FullName},
{Environment.ConnectionString, connectionString},
{Environment.ShowSql, "true"},
{Environment.BatchSize, "100"},
{Environment.Isolation,"ReadCommitted"}
}))
.Mappings(map => map.AutoMappings.Add(AutoMap.AssemblyOf<Transaction>(new AutomappingConfiguration())
.Conventions.AddFromAssemblyOf<ReferenceConvention>()
.Conventions.Add(DynamicUpdate.AlwaysTrue())
.Conventions.Add(DynamicInsert.AlwaysTrue())
.UseOverridesFromAssemblyOf<CurrencyOverride>))
.BuildSessionFactory();