如何使实体框架类型提供程序使用运行时配置文件?

时间:2012-12-20 17:14:21

标签: entity-framework f# type-providers

我有一个F#库项目,我正在使用C#web项目。我想在我的F#项目中使用实体框架类型提供程序,并让它从Web.config获取连接字符串 - 但是我无法使其工作。

type internal FooDb = 
    SqlEntityConnection<ConnectionStringName="FooDb", Pluralize=true>

在设计时,我需要在F#库项目中有一个App.config文件,其连接字符串具有匹配的名称。

在运行时,当从C#Web项目调用我的F#代码时,我收到一个错误,它无法找到“App.config”文件。这让我感到惊讶,因为我期望在运行时它只使用ConfigurationManager.ConnectionStrings从当前活动的配置文件加载连接字符串(对于Web应用程序,Web.config)。然而,情况似乎并非如此。

我尝试添加ConfigFile参数:

type internal FooDb = 
    SqlEntityConnection<ConnectionStringName="FooDb", ConfigFile="Web.config", Pluralize=true>

但这只是让它在设计时抱怨它无法找到Web.config

然后我将F#库项目中的App.config文件重命名为Web.config,这似乎让事情变得有效了。但是,我对这个解决方案感到不安。这真的是它的工作方式吗?我必须在我的库项目中有一个web.config文件?如果我想从命令行可执行文件中使用相同的库,那么我该怎么办?在该环境中,配置文件被称为AssemblyName.exe.config

强迫我硬编码在不同上下文中可能具有不同名称的配置文件的名称似乎非常脆弱,而且设计很差。请告诉我,我错过了什么。

1 个答案:

答案 0 :(得分:3)

你遇到的问题看起来确实很不幸,我不知道你是否遗漏了什么。但是,SqlEntityConnection documentation表示FooDb应该有GetDataContext重载,其中“在运行时确定连接字符串时可以使用”connectionString参数。“也许这会给你一个足够好的解决方法(即自己传递ConfigurationManager.ConnectionStrings的连接字符串)。