0

ドメイン クラスに対してクエリを実行できる汎用リポジトリを構築しようとしています。

私のリポジトリ インターフェイスは次のようになります。

public interface IRepository<T>
{
    T Get(int id);
    IQueryable<T> Query();
    void Add(T model);
    void Remove(T model);
} 

エンティティUserEntityフレームワーク クラスとUserドメイン クラスがあるので、User. はUserEntityEntity Framework レイヤーの内部にある必要があるため、他のサービスに公開しないでください。

のようなクエリは、ドメイン クラスuserRepository.Query().Single(user => user.UserName == "Toni")を返す必要があります。Userただし、内部的にはIDbSet<UserEntity>、エンティティ フレームワークから返された に対してクエリを実行する必要があります。式ツリー (Singleクエリ操作を含む) は、 に対するクエリに関連付ける必要がありますIDbSet<UserEntity>。に対してクエリを実行した後、ドメイン クラスIDbSet<UserEntity>に変換したいと考えています。これは可能ですか?UserEntityUser

に対して内部的にクエリを実行するクラスのIQueryable実装を作成することを念頭に置いています。UserUserEntity

public class MappedEntityQuery<TModel, TEntity> : IQueryable<TModel>
{
}
4

1 に答える 1

1

Code First では、DbContext にあるテーブルにアクセスするためのすべての IDbSet プロパティを持つ規則が必要です。

そうではありません。モデル ビルダーでエンティティへのマッピングを提供する場合、コンテキストでセットを宣言する必要はありません。あなたの場合EntityTypeConfiguration<T>ComplexTypeConfiguration<T>派生クラスを介してマッピングを宣言する必要があります。コンテキストでDbSet呼び出すことにより、マップされたエンティティ タイプの任意のインスタンスを作成できます。Set<T>()

ただし、このプロジェクトでは、Database First アプローチを使用しています。これは、データベース メタデータを 1 つのメタデータ ファイル (埋め込まれます) で指定する必要があるため、異なるプロジェクトのエンティティを使用して DbContext をロード構成することもできません。

それは部分的にしか当てはまりません。EDMX メタデータは、メイン プロジェクトに埋め込まれた単一のファイルに含まれている必要がありますが、エンティティ クラスは、自動生成ではなく独自のものを使用する場合は必要ありません。したがって、提案されたアプローチは機能するはずです。

ただし、本当にモジュール性を実現したい場合は、EDMX を使用しないでください。将来、モジュールを追加または変更する場合は、中央プロジェクトも変更する必要がありますが、それは他のすべてのモジュールに影響を与える可能性があります。モジュール性の概念が崩れますよね?

于 2012-09-01T22:51:28.537 に答える