5

我正在为 EF 使用存储库模式并且遇到了一个问题,即我无法弄清楚如何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当它以这种方式创建时,我如何真正告诉连接到什么?

4

1 回答 1

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 });
    }
}
于 2013-08-27T07:02:43.987 回答