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)
问题是,当它试图创建的实例,这总是会引发以下错误ObjectContext与EFTracingProvider:"指定的架构是无效的错误:\ r \n(0,0):错误0175:指定的存储提供不能在配置中找到,或者无效."
如果我用web配置中的连接字符串的名称替换containerName并且不执行第一次,Activator.CreateInstance<T>()那么它可以正常工作.所以这个问题与我创建第一个实例然后第二个实例的事实有关.
这是我尝试过的:
我试图避免开发人员传递ObjectContextAND的通用类型连接字符串的名称.这似乎有点多余.
所以我的问题是:如何从表示对象上下文的泛型中获取连接名称,并且仍然能够使用它来使用EF Trace生成的EntityConnection创建对象上下文的实例?
我的问题是关于为什么这种方法不起作用,而不是关于可能的解决方法.
不是很直接的答案。
我不建议硬编码假设存在这样的配置:
(T)Activator.CreateInstance(typeof(T), EFTracingProviderUtils.CreateTracedEntityConnection(containerName));
Run Code Online (Sandbox Code Playgroud)
在极少数情况下(除了简单的示例之外),人们会将 EF 连接字符串存储到默认名称下的配置文件中。我认为接受连接字符串或应用某种约定可能会更好。
供参考。DbContext不直接暴露DefaultContainerName。你需要ObjectContext先得到它。
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |