[英]Entity Framework 5 - multiple DbContext and a Generic Repository class
[英]Generic Repository with different databases, entity types and dbcontext
我已按照此易于遵循的指南为asp.net Web api项目实现了一个简单的通用存储库:
http://www.dataworks.ie/blog/entity_framework_5_with_automapper_and_repository_pattern
很好
但是,我在开发中的解决方案有两个具有相同架构的简单数据库-用于测试/开发以及在本地(和脱机)运行时的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>();
如果我使用的是SQL Server CE,我将拥有
public ActionResult Index()
{
IGenericRepository<MyProj.Data.SqlCe.User> userRepo = new GenericRepository<MyProj.Data.SqlCe.User>();
因此,在切换数据库时,我必须手动更改为正确的程序集命名空间以引用我的实体。
很抱歉,如果这已经做完了,因为已经有一段时间没有做这些了,那么这种情况下最好的/优雅的解决方案是什么? 上面的看起来很脏。 另外,我所有的通用存储库代码当前都位于与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>()
}
}
要么使用反射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.