Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有不同数据库、实体类型和dbcontext的通用存储库_C#_Asp.net_Entity Framework_Azure_Generics - Fatal编程技术网

C# 具有不同数据库、实体类型和dbcontext的通用存储库

C# 具有不同数据库、实体类型和dbcontext的通用存储库,c#,asp.net,entity-framework,azure,generics,C#,Asp.net,Entity Framework,Azure,Generics,我已经为我的asp.net web api项目实现了一个简单的通用存储库,遵循以下易于遵循的指南: 那很好 但是,我正在开发的解决方案有两个具有相同模式的简单数据库—一个用于测试/开发的SQL Server CE(在本地(和脱机)运行时)和一个SQL Azure(在联机时)。两者都在单独的部件中创建了EF图层。我通过上下文类构造函数中的web.config连接字符串切换DbContext。问题在于我的控制器代码 例如,如果使用Azure,我会 public ActionResult Index

我已经为我的asp.net web api项目实现了一个简单的通用存储库,遵循以下易于遵循的指南:

那很好

但是,我正在开发的解决方案有两个具有相同模式的简单数据库—一个用于测试/开发的SQL Server CE(在本地(和脱机)运行时)和一个SQL Azure(在联机时)。两者都在单独的部件中创建了EF图层。我通过上下文类构造函数中的
web.config
连接字符串切换
DbContext
。问题在于我的控制器代码

例如,如果使用Azure,我会

public ActionResult Index()
{
    IGenericRepository<MyProj.Data.SqlAzure.User> userRepo = new GenericRepository<MyProj.Data.SqlAzure.User>();
public ActionResult Index()
{
    IGenericRepository<MyProj.Data.SqlCe.User> userRepo = new GenericRepository<MyProj.Data.SqlCe.User>();
public ActionResult Index()
{
IGenericRepository userRepo=新的GenericRepository();
如果我使用的是SQL Server CE,那么

public ActionResult Index()
{
    IGenericRepository<MyProj.Data.SqlAzure.User> userRepo = new GenericRepository<MyProj.Data.SqlAzure.User>();
public ActionResult Index()
{
    IGenericRepository<MyProj.Data.SqlCe.User> userRepo = new GenericRepository<MyProj.Data.SqlCe.User>();
public ActionResult Index()
{
IGenericRepository userRepo=新的GenericRepository();
因此,在切换数据库时,我必须手动更改为正确的程序集命名空间以引用实体


很抱歉,如果这项工作已经完成了,因为有一段时间没有完成其中一项工作,那么对于这种情况,什么是最好的/优雅的解决方案?上面的解决方案看起来非常脏。而且我所有的通用存储库代码当前都位于与web应用程序相同名称空间的模型文件夹中。

因为您使用的是通用存储库,它不知道如何确定您想要哪个用户实体,除非您告诉它


你可以做的是,创建一个工厂来为你解决这个问题。GenericRepositorySqlAzure和GenericRepositorySqlCe

想到的唯一解决方案是使用一个工厂类来创建实例,该实例带有配置文件中定义的开关,例如

public DbRepositoryFactory
{    
    public IGenericRepository<User> GetUserRepository()
    {
        return ConfigurationManager.AppSettings["DbSwitch"].Equals("Azure")
            ? new GenericRepository<MyProj.Data.SqlAzure.User>()
            : new GenericRepository<MyProj.Data.SqlCe.User>()
    }
}
公共数据库存储工厂
{    
公共IGenericRepository GetUserRepository()
{
返回ConfigurationManager.AppSettings[“DbSwitch”].Equals(“Azure”)
?新的通用存储库()
:新建GenericRepository()
}
}

或者使用反射。

为什么不使用依赖注入并根据应用程序配置注入正确的存储库类型?谢谢大家,我们将调查建议并在之后奖励分数。非常感谢。为什么在EF已经将存储库模式实现为DbSet时使用它?因为我不知道最好的解决方案尝试了泛型以查看发生了什么。可能只对单元测试有用。所以我忘记了所有IGenericRepository的内容,并在每个控制器的顶部放置了一个全局变量来初始化上下文?比如。问题仍然是一样的,但当我在Azure和Sql之间切换时,如何最好地引用控制器中的同名实体GetUserRepository可以返回SqlAzure.User或SqlCe.User吗?我不必在方法定义中指定User类型的命名空间(即public IGenericRepository…)来编译它,因此也会有同样的问题。创建一个实现包含所需属性的接口的分部类。这样就可以了作业。抱歉,我没有完全理解。我收到“无法隐式转换类型”错误。这是一种抽象工厂模式吗?我的控制器是否使用属性(类型存储库)这个工厂类的实例?一个例子将非常有用,非常感谢。创建一个包含用户对象属性的接口,该属性在2 db上下文中是通用的,例如,
public IAmAUser{public guid UserId{get;set;}
。然后为实现接口的Azure和CE用户对象创建分部类,例如,
公共分部类MyProject.Data.SqlAzure.user:IAmAUser{}
。然后,您应该能够使用IAmAUser界面,而不是特定的用户对象。注意,可能需要添加一些实体框架属性。为了解决我的问题,我们将奖励这些属性。不过,事后看来,依赖项注入和反射是这种设置的方法。