私の以前のスレッド(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
を使用するという応答を持っています。
私はあなたのアイデアやアプローチを知ってうれしいです。
私が問題だかわからないんだけど?あなたはジェネリックリポジトリを持っています、なぜあなたのサービスで 'context.Set <>()'をする必要がありますか?ジェネリックの新しいオブジェクトをエンティティのタイプとしてインスタンス化するだけです。あなたはジェネリックをよく理解していないようです。 – 12seconds
私はRESTエンドポイントにリクエストを送るときに、 'MyObject'を' TEntity'とし、 'MyEFClass'や' MyEFAnotherClass'のような特定の型を必要とします(適切なDbSetを指し示し、 MyObjectが実際にEFエンティティでない限り、appがクラッシュします。 –
あなたの問題は正しいリポジトリタイプをアクティブにする方法です。 Activator.CreateInstanceを見てください。 –