如何在通用资料库中提供实体类型/数据库类型

如何在通用资料库中提供实体类型/数据库类型

问题描述:

我在之前的一个线程(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); 
    } 
} 

我也有有库场&执行像DoesRecordExist(string id)操作的服务类。我曾与的EntityFramework注册几个类(他们每个人是指数据库表:MyEFClass和myEFANotherClass分别)看起来就像是:

public partial class MyEFClass: MyObject 
{ 
} 

public partial class MyEFAnotherClass: MyObject 
{ 
} 

类是空的这里,是因为我用代码优先& MyObject其实有着所有领域的EF类,所以空&应该只用于数据库表之间的导航。

现在,我该如何判断哪个DbSet处于活动状态。例如如何对通用存储库说我使用MyEFClassMyEFAnotherClass? 我相信它应该从服务中调用。 我一直试图用context.Set<something>()something.GetType()从装配,但无论如何失败。 在最后时刻,我总是有回应,我使用基类MyObject这不是一个有效的EF DbSet(只是一个基地)。

我很乐意知道您的想法或方法。

+0

我不知道有什么问题?你有通用的存储库,为什么你需要在你的服务上执行'context.Set ()'?您只需将您的泛型的新对象实例化为实体类型。似乎你对泛型没有很强的理解。 – 12seconds

+0

当我向REST端点发送请求时,它将基本类型MyObject作为TEntity来提供,而我需要的是指定适当的DbSet并使用特定的类型如MyEFClass或MyEFAnotherClass,应用程序崩溃,只要“MyObject”实际上不是EF实体。 –

+0

您的问题现在是如何激活正确的存储库类型。看看Activator.CreateInstance。 –

显然你有一些你叫做service,它有MyObjectReposistory作为一个字段。对象库有一个DbContext as字段。

This service has active的概念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; 
    } 
+0

感谢您的留言。我已经想出了类似的东西,可能这种方法将继续下去。 –