我已经根据这个易于遵循的指南为我的asp.net web api项目实现了一个简单的通用存储库:
http://www.dataworks.ie/blog/entity_framework_5_with_automapper_and_repository_pattern
工作正常。
但是,我的开发解决方案有两个简单的数据库,它们具有相同的模式 - 用于测试/ dev的SQL Server CE以及运行本地(和脱机)时的SQL Server CE以及联机时的SQL Azure。两者都具有在单独的组件中创建的EF层。我通过上下文类的构造函数中的// Get current columns here.
var list: ArrayList = grid.columns as ArrayList;
var cols: Array = list.source;
var col: GridColumn = new GridColumn();
col.headerText = "1-Aug";
col.dataField = "foo";
cols.push(col);
// Redefine columns.
grid.columns = new ArrayList(cols);
<s:DataGrid id="grid">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="type" width="100"/>
<s:GridColumn dataField="name" width="100"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>
连接字符串切换DbContext
。问题出在我的控制器代码上。
例如如果使用Azure我会有
web.config
如果我使用SQL Server CE,我会
public ActionResult Index()
{
IGenericRepository<MyProj.Data.SqlAzure.User> userRepo = new GenericRepository<MyProj.Data.SqlAzure.User>();
因此,当我切换数据库时,我必须手动更改为正确的程序集名称空间以引用我的实体。
很抱歉,如果这已经做好了,因为我们暂时没有完成其中一项,但这种情况的最佳/优雅解决方案是什么?上面看起来非常脏。此外,我的所有通用存储库代码当前都位于与Web应用程序相同的命名空间中的模型文件夹中。
答案 0 :(得分:1)
由于您使用的是通用存储库,因此除非您告诉它,否则它不知道如何确定您想要的用户实体。
您可以做些什么,创建一个能够为您解决问题的工厂。 GenericRepositorySqlAzure和GenericRepositorySqlCe
答案 1 :(得分:1)
唯一能解决的解决方案是让工厂类使用配置文件中定义的开关创建实例,例如
public DbRepositoryFactory
{
public IGenericRepository<User> GetUserRepository()
{
return ConfigurationManager.AppSettings["DbSwitch"].Equals("Azure")
? new GenericRepository<MyProj.Data.SqlAzure.User>()
: new GenericRepository<MyProj.Data.SqlCe.User>()
}
}
要么使用反射,要么使用反射。