gpt4 book ai didi

c# - 如何在不传入连接名称的情况下在 Entities ObjectContext 上设置 EF Trace

转载 作者:可可西里 更新时间:2023-11-01 03:02:30 24 4
gpt4 key购买 nike

我正在编写一个可重用的基础存储库类,开发人员将在其中传递一个代表 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 的实例时,它总是抛出以下错误与 EFTracingProvider : “指定的架构无效。错误:\r\n(0,0):错误 0175:在配置中找不到指定的存储提供程序,或者它无效。”

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

这是我尝试过的:

  1. 处理并清除第一个实例。
  2. 关闭第一个实例的连接。
  3. 将第一个实例放在 using 语句中。
  4. 明确定义包含 ObjectContext 的程序集启动项目中 web.config 中的连接字符串( MetadataException when using Entity Framework Entity Connection )

我试图避免让开发人员传入 ObjectContext 的通用类型AND 连接字符串的名称。这似乎有点多余。

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

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

最佳答案

这是您的解决方案,将以下代码添加到您的配置文件中:

<system.data>
<DbProviderFactories>
<add name="EF Caching Data Provider"
invariant="EFCachingProvider"
description="Caching Provider Wrapper"
type="EFCachingProvider.EFCachingProviderFactory, EFCachingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
<add name="EF Tracing Data Provider"
invariant="EFTracingProvider"
description="Tracing Provider Wrapper"
type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
<add name="EF Generic Provider Wrapper"
invariant="EFProviderWrapper"
description="Generic Provider Wrapper"
type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
</DbProviderFactories>
</system.data>

问题出现在 EFTracingProviderUtils.CreateTracedEntityConnection 方法中。它搜索 .Net Framework Data Provider - EFTracingProvider,它必须在您的配置文件中指定。当找不到它时,它就无法为其目的构建这样的连接字符串:

"metadata=reader://998e0526-8372-4bf9-83d3-949dececce96;提供者=EFTracingProvider;提供者连接字符串=\"wrappedProvider=;data source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\database.mdf;集成安全性=真;连接超时=30;用户实例=真;multipleactiveresultsets=真;App=EntityFramework\";"

如您所见,元数据读取器指定了此连接字符串,此处将是当 EF 找不到 EFTracingProvider 时抛出的 MetadataException。只是第三方方法的问题。

您可以调用下一个方法并接收相同的结果,而无需对您的配置进行任何更改:

EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(containerName, new string[]{});

关于c# - 如何在不传入连接名称的情况下在 Entities ObjectContext 上设置 EF Trace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13291471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com