如何在使用db context时指定连接字符串

时间:2013-08-23 11:42:21

标签: c# entity-framework

我正在使用EF的Repository模式并遇到了一个问题,因为我无法弄清楚如何通过变量设置DbContext的连接字符串。目前我的构造函数是无参数的(它必须符合他的模式),即

IUnitOfWork uow = new UnitOfWork<EMDataContext>();
DeviceService deviceService = new DeviceService(uow);
var what = deviceService.GetAllDevices();


public UnitOfWork()
{
    _ctx = new TContext();
    _repositories = new Dictionary<Type, object>();
    _disposed = false;
}

EMDataContext过去常常在其构造函数中使用一个字符串来定义ConnectionString,但是不能再这样做了,所以如何实际告诉EMDataContext什么时候连接到它这种时尚?

1 个答案:

答案 0 :(得分:3)

您的问题可以重写为“如何将参数传递给具有new()约束的泛型类型构造函数”。

来自MSDN

  

新约束指定泛型类中的任何类型参数   声明必须有一个公共无参数构造函数。

由于裸实体框架上下文不包含无参数构造函数,我假设您的EMDataContext是您的自定义上下文:

public class EMDataContext : DbContext
{
      // parameterless ctor, since you're using new() in UnitOfWork<TContext>
      public EMDataContext() : base(???)
      {
      }

      public EMDataContext(string connectionString) : base(connectionString)
      {
      }
}

现在,我认为你的EMDataContext无法使用无参数构造函数,因此也无法实现new()约束,尤其是当你说想要传递一个连接字符串参数。

尝试更改UnitOfWork以接受其构造函数中已初始化的上下文(常见模式):

public class UnitOfWork<TContext>
{
    public UnitOfWork(TContext ctx)
    {
        _ctx = ctx;
    }
}

或者(如果您仍想“适应模式”),尝试使用Activator实例化上下文:

public class UnitOfWork<TContext>
{
    public UnitOfWork(string connectionString)
    {
        _ctx = (TContext)Activator.CreateInstance(typeof(TContext), new[] { connectionString });
    }
}