2017-10-28 11 views
0

私の以前のスレッド(How to choose specific DbSet from context by name)の1つで説明した問題の実現に問題があります。 私はクラスを持っている:汎用リポジトリでエンティティタイプ/ dbsetタイプを提供する方法

public class MyObjectRepository<TEntity> : MyObjectRepository<TEntity> 
    where TEntity : MyObject 
{ 
    private readonly DbContext _dbContext; 


public MyObjectRepository(DbContext dbContext) 
{ 
     _dbContext = dbContext; 
} 

public bool DoesRecordExist(string id) 
    { 
     return _dbContext.Set<TEntity>() 
      .Any(x => x.id == id); 
    } 
} 

は、私はまた、リポジトリフィールドを持っている&がDoesRecordExist(string id)のような操作を実行し、サービスクラスを持っています。実際に& MyObjectは、すべてのフィールドを持っている私は、コード最初に使用しているため

public partial class MyEFClass: MyObject 
{ 
} 

public partial class MyEFAnotherClass: MyObject 
{ 
} 

クラスはここに空です:そのように見える:私はいくつかのクラスがEntityFrameworkに登録している(それぞれMyEFClassとmyEFANotherClassそれらの一つは、テーブルDBを参照します)空であるため、&は、dbテーブル間のナビゲーションにのみ使用してください。

ここで、どのDbSetがアクティブであるかをコンテキストにどのように伝えることができますか。たとえば、汎用リポジトリにMyEFClassまたはMyEFAnotherClassを使用しているとしますか? 私はそれがサービスから呼び出されるべきであると信じます。 私はアセンブリからcontext.Set<something>()something.GetType()を試してきましたが、とにかく失敗しました。 最後の瞬間、私は常に有効なEF DbSet(単なるベース)ではないベースクラスMyObjectを使用するという応答を持っています。

私はあなたのアイデアやアプローチを知ってうれしいです。

+0

私が問題だかわからないんだけど?あなたはジェネリックリポジトリを持っています、なぜあなたのサービスで 'context.Set <>()'をする必要がありますか?ジェネリックの新しいオブジェクトをエンティティのタイプとしてインスタンス化するだけです。あなたはジェネリックをよく理解していないようです。 – 12seconds

+0

私はRESTエンドポイントにリクエストを送るときに、 'MyObject'を' TEntity'とし、 'MyEFClass'や' MyEFAnotherClass'のような特定の型を必要とします(適切なDbSetを指し示し、 MyObjectが実際にEFエンティティでない限り、appがクラッシュします。 –

+0

あなたの問題は正しいリポジトリタイプをアクティブにする方法です。 Activator.CreateInstanceを見てください。 –

答えて

0

明らかに、serviceと呼ばれるものがあります。これはMyObjectReposistoryをフィールドとして持っています。オブジェクトリポジトリにはフィールドとしてDbContextがあります。

このserviceは、アクティブのMyObjectという概念を持っています。 MyEfClassまたはMyOtherEfClassがアクティブなものかどうかがわかります。

これは、誰かがあなたのサービスにどのクラスがアクティブなリポジトリであるかを伝える必要があることを意味します。これが完了すると、アクティブなリポジトリで何かをしたいときはいつ、どのリポジトリが意味されているのかわかります。

通常、リポジトリは、データベースの実際の内部を隠すように設計されています。したがって、私はあなたのテーブルの種類をあなたのサービスのユーザーに公開しません。

は、列挙型を使用することを検討してください:

enum ActiveRepository 
{ 
    MyEfClass, 
    MyOtherEfClass, 
} 


class Service 
{ 
    private MyEfClass myEfRepository = ...; 
    private MyEfClass myOtherRepository = ...; 
    public ActiveRepository ActiveRepository {get; set;} 

    private IDbSet<MyObject> GetActiveRepository() 
    { 
     if (this.ActiveRepository == MyEfClass) 
      return this.myEfRepository; 
     else 
      return this.myOtherEfRepository; 
    } 
+0

あなたの投稿に感謝します。私はそれのようなものを思い付いてきました。おそらくこのアプローチは今後も続くでしょう。 –

関連する問題