繁体   English   中英

如何在通用存储库中提供实体类型/ dbset类型

[英]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是活动的。 例如,如何对使用MyEFClassMyEFAnotherClass通用存储库说? 我相信应该从服务中调用它。 我一直在尝试从程序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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM