我在上一个帖子(How to choose specific DbSet from context by name)中讨论过的问题的实现存在问题。 我有一节课:
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);
}
}
我还有一个服务类,它有一个存储库字段&amp;执行DoesRecordExist(string id)
之类的操作。我在EntityFramework中注册了几个类(每个类都分别引用了db表:MyEFClass和myEFANotherClass),看起来像这样:
public partial class MyEFClass: MyObject
{
}
public partial class MyEFAnotherClass: MyObject
{
}
这里的类是空的,因为我使用代码优先&amp; MyObject
实际上具有EF类的所有字段,因此它们是空的&amp;应该只用于数据库表之间的导航。
现在,我如何告诉上下文哪个DbSet处于活动状态。例如,如何对我使用MyEFClass
或MyEFAnotherClass
的通用存储库说?
我相信它应该从服务中调用。
我一直在尝试使用context.Set<something>()
和something.GetType()
来自程序集,但无论如何都失败了。
在最后一刻,我总是有响应,我使用基类MyObject
,它不是有效的EF DbSet(只是一个基础)。
我很乐意了解您的想法或方法。
答案 0 :(得分: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;
}