![](/img/trans.png)
[英]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.