在 F# 中,什么时候 "constant string expression" 不是 "constant string expression"

in F#, when is a "constant string expression" not a "constant string expression"

F# 的新手,所以我还是有点习惯 "type inference"。 我正在尝试在 F# 中使用 EntityFramework,当我尝试建立连接时,出现错误,我的连接字符串(从 app.config 中读取)是 "not a valid constant expression or custom attribute value"。如果我对连接字符串进行硬编码就没问题,正如您所期望的那样。

open FSharp.Configuration
type Settings = AppSettings<"app.config">
let ConnStr = Settings.ConnectionStrings.Model
type private Connection = SqlEntityConnection<ConnectionString=ConnStr, Pluralize = true>

我做错了什么? "F# way" 这样做有什么不同吗?

SqlEntityConnection 是类型提供程序。类型提供程序在 编译时间 工作(将它们视为编译器插件;或者如果您喜欢 Lisp,则将它们视为穷人的宏)。因此,在编译时需要知道所有类型提供程序参数。

现在,问一个问题:ConnStr 在编译时已知吗?
不,当然不是,因为您想从配置文件中提取它。

您应该使用的方式是:

  1. 硬编码连接字符串,将其指向编译时可用的数据库。这将使类型提供程序有机会在编译时查看数据库,并从中生成所有类型。
  2. 当您调用 Connection.GetDataContext 时,将运行时连接字符串作为参数提供给它。这将告诉它连接到您的配置中实际指定的任何数据库,而不是您在编译时硬编码的数据库。