0

再利用可能なユーザー管理機能を提供する汎用ユーザー リポジトリ基本クラスを作成しました。

public class UserRepository<TUser> where TUser : new, IUser
{

}

UserImpl と呼ばれる IUser の具体的な実装と、対応するマッピングclass UserImplMap : ClassMap<UserImpl>があります (それらはすべて同じ名前空間とアセンブリにあります)。AddFromAssemblyOf を使用してマッピングを追加します。また、これを使用してスキーマを作成/生成します。

これまでのところ非常に良好で、物事は期待どおりに機能します。

さて、別のプロジェクトで、IUser 実装クラスにいくつか追加のプロパティが必要だったので、新しい を実装しましたclass UserImplEx : UserImpl。このクラスには、必要な追加のプロパティがあります。また、新しいマッピングを作成しましたclass UserImplExMap : SubclassMap<UserImplEx>

このアプローチを使用してスキーマを作成すると、UserImpl 用と UserImplEx 用の 2 つのテーブルが得られます。

UserImplEx のすべてのプロパティ (自己と継承) が 2 つのテーブルに分割されるのではなく、単一のテーブル UserImplEx にマップされるように、何らかの方法で Fluent マッピングを構成/コーディングすることは可能ですか?

または、 で完全なマッピングを提供するとUserImplExMap : ClassMap<UserImplEx>、必要に応じてスキーマを取得できますが、UserImpl の追加テーブルも取得します (対応するマッピングが UserRepository アセンブリに存在するため)。このアプローチに従う場合、AddFromAssemblyOf に特定のマッピング クラスを除外するように指示する方法はありますか?

4

1 に答える 1

0

オプション1

ここに継承があり、正しい型を戻したいので、NHはデータが入っているテーブルまたはディスクリミネーターのいずれかを介して型をどこかに保存する必要があります。

表の識別子列が重要でない場合は、追加DiscriminatorColumn("userType", "user");UserImplMapて追加DiscriminatorValue("userEx")しますUserImplExMap

オプション 2

class MyTypeSource : ITypeSource
{
    private ITypeSource _inner = new AssemblyTypeSource(typeof(UserImplMap).Assembly);

    public IEnumerable<Type> GetTypes()
    {
        return _inner.Where(t => t != typeof(UserImplMap)).Concat(new [] { typeof(UserImplExMap) });
    }
    public void LogSource(IDiagnosticLogger logger)
    {
        _inner.LogSource(logger);
    }
    public string GetIdentifier()
    {
        return _inner.GetIdentifier();
    }
}

そして構成するとき

.Mappings(m =>
{
    var model = new PersistenceModel();
    PersistenceModel.AddMappingsFromSource(new MyTypeSource());
    m.UsePersistenceModel(model);
})
于 2013-07-18T06:18:21.280 に答える