[英]How to pass an string as a type parameter for a generic DbSet in Entity Framework?
[英]How to provide entity type/dbset type in Generic Repository
我在上一個線程( 如何通過名稱從上下文中選擇特定的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)
。 我在EntityFramework上注冊了幾個類(它們每個都引用數據庫表:MyEFClass和myEFANotherClass),它們看起來像這樣:
public partial class MyEFClass: MyObject
{
}
public partial class MyEFAnotherClass: MyObject
{
}
類在這里是空的,因為我使用代碼優先& MyObject
實際上具有EF類的所有字段,因此,它們是空的,並且應僅用於數據庫表之間的導航。
現在,我如何告訴上下文哪個DbSet是活動的。 例如,如何對使用MyEFClass
或MyEFAnotherClass
通用存儲庫說? 我相信應該從服務中調用它。 我一直在嘗試從程序context.Set<something>()
使用context.Set<something>()
和something.GetType()
,但是無論如何還是失敗了。 最后,我總是收到使用基類MyObject
響應,該基類不是有效的EF DbSet(只是一個基數)。
我很高興知道您的想法或方法。
顯然,您有一個稱為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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.