如何在Generic Repository中提供实体类型/ dbset类型

时间:2017-10-28 15:43:57

标签: c# entity-framework linq

我在上一个帖子(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处于活动状态。例如,如何对我使用MyEFClassMyEFAnotherClass的通用存储库说? 我相信它应该从服务中调用。 我一直在尝试使用context.Set<something>()something.GetType()来自程序集,但无论如何都失败了。 在最后一刻,我总是有响应,我使用基类MyObject,它不是有效的EF DbSet(只是一个基础)。

我很乐意了解您的想法或方法。

1 个答案:

答案 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;
    }