我正在使用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
什么时候连接到它这种时尚?
答案 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 });
}
}