如何在Entities ObjectContext上设置EF Trace而不传入连接名称

byg*_*ace 17 c# linq-to-entities

我正在编写一个可重用的基础存储库类,开发人员将传递一个表示通用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
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当它试图创建的实例,这总是会引发以下错误ObjectContextEFTracingProvider:"指定的架构是无效的错误:\ r \n(0,0):错误0175:指定的存储提供不能在配置中找到,或者无效."

如果我用web配置中的连接字符串的名称替换containerName并且不执行第一次,Activator.CreateInstance<T>()那么它可以正常工作.所以这个问题与我创建第一个实例然后第二个实例的事实有关.

这是我尝试过的:

  1. 处理并清空第一个实例.
  2. 关闭第一个实例上的连接.
  3. 将第一个实例放在using语句中.
  4. 在启动项目的web.config中的连接字符串中显式定义包含ObjectContext的程序集(使用实体框架实体连接时的MetadataException)

我试图避免开发人员传递ObjectContextAND的通用类型连接字符串的名称.这似乎有点多余.

所以我的问题是:如何从表示对象上下文的泛型中获取连接名称,并且仍然能够使用它来使用EF Trace生成的EntityConnection创建对象上下文的实例?

我的问题是关于为什么这种方法不起作用,而不是关于可能的解决方法.

Mik*_*liy 0

不是很直接的答案。

我不建议硬编码假设存在这样的配置:

(T)Activator.CreateInstance(typeof(T), EFTracingProviderUtils.CreateTracedEntityConnection(containerName));
Run Code Online (Sandbox Code Playgroud)

在极少数情况下(除了简单的示例之外),人们会将 EF 连接字符串存储到默认名称下的配置文件中。我认为接受连接字符串或应用某种约定可能会更好。

供参考。DbContext不直接暴露DefaultContainerName。你需要ObjectContext先得到它。