我正在编写一个可重用的基础存储库类,开发人员将在其中传递一个表示 的泛型,ObjectContext
并且基础存储库将使用Activator.CreateInstance
. 调试时我想使用 nuget 包CommunityEFProviderWrappers.EFTracingProvider
。所以我设置对象上下文的代码如下所示:
public void RenewDataContext()
{
#if DEBUG
// get the default container name
var containerName = Activator.CreateInstance<T>().DefaultContainerName;
// create an instance of the object context using EF Trace
Context = (T)Activator.CreateInstance(typeof(T), EFTracingProviderUtils.CreateTracedEntityConnection(containerName));
Context.EnableTracing();
#else
Context = Activator.CreateInstance<T>();
#endif
}
问题是,当它尝试创建具有以下内容的实例时,它总是抛出以下错误: “指定ObjectContext
的架构无效。错误:\r\n(0,0):错误 0175:指定的存储提供程序不能在配置中找到,或者无效。”EFTracingProvider
如果我用 web 配置中的连接字符串的名称替换containerName并且不做第一个,Activator.CreateInstance<T>()
那么它工作正常。所以这个问题与我创建第一个实例然后是第二个的事实有关。
这是我尝试过的:
- 处置并清除第一个实例。
- 在第一个实例上关闭连接。
- 将第一个实例放在using语句中。
- 在启动项目的 web.config 中的连接字符串中显式定义包含 ObjectContext 的程序集(使用 Entity Framework Entity Connection 时的 MetadataException)
我试图避免让开发人员传入ObjectContext
连接字符串的泛型类型和名称。这似乎有点多余。
所以我的问题是:如何从表示对象上下文的泛型中获取连接名称,并且仍然能够使用它来使用 EF Trace 生成的 EntityConnection 创建对象上下文的实例?
我的问题是关于为什么这种方法不起作用,而不是关于可能的解决方法。