4

私たちのエンティティには、共通のプロパティのグループがあります。マッピングの繰り返しを減らすために、ID と共通プロパティをマッピングする基本 ClassMap を作成しました。各エンティティの ClassMap について、ベースをサブクラス化するだけでうまく機能します。新しいプロジェクトでは、NH に DB スキーマの生成も任せています。問題は、列の順序が、基本 ClassMap のプロパティが最初に表示され、その後にサブクラスにマップされたものが続くということです。このビルドの要件は、列が特定の順序で表示されることです。

これを回避するために、次のことを行いました。

public class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        MapEntity();
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }

    protected virtual void MapEntity()
    {
    }
}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    public SomeEntity()
    {
        base.MapEntity();
    }

    protected override void MapEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

これは機能しますが、ハックのように感じます。ハッキング要因以外に、問題になる可能性があるものはありますか?

4

2 に答える 2

5

基本クラスとマップ メソッドを抽象化すると、ハッキリしなくなります...

public abstract class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        MapEntity();
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }

    protected abstract void MapEntity();

}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    protected override void MapEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

これにより、共通のプロパティ列がテーブルの最後に保持されます。その後も外部キー列が追加されることに注意してください。スキーマ作成スクリプトを手動で変更しない限り、流れるように列の順序を完全に制御する方法はないと思います。

于 2010-11-15T19:48:24.807 に答える
3

私は自分で似たようなものを実装しなければなりませんでした。

あなたが持っていると仮定すると

public class SomeEntity : Entity
{ 
    ...
}

「ハックに似ていない」方法は次のとおりです。

public abstract class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }
}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    public SomeEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

最終的には同じ結果になりますが、オーバーライドされたメソッドを使用してマッピングを追加していません。自動的に処理されます。

于 2010-09-30T05:18:33.433 に答える