1

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();
4

1 に答える 1

2

IPropertyConventionインターフェイスを実装し、インスタンス名と照合することで、実際には独自の規則を作成できるはずです。次に例を示します。

public class DefaultAutiableConvention: IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.Name == "CreatedBy" || instance.Name == "CreatedOn")
        {
            instance.Generated.Insert();
        }
        else if (instance.Name == "ModifiedBy" || instance.Name == "ModifiedOn")
        {
            instance.Generated.Always();
        }
    }
}

そして、その規則も構成に追加します

.Conventions.Add(new DefaultAutiableConvention())
于 2013-10-12T08:48:07.667 に答える