在F#中,何时是"常量字符串表达式"不是"常量字符串表达式"

时间:2016-06-07 16:44:32

标签: entity-framework f# app-config

F#的新手,所以我仍然习惯于#34;类型推断"。 我试图在F#中使用EntityFramework,当我尝试构建连接时,我得到的错误是我的连接字符串(从app.config中读取)是"不是有效的常量表达式或自定义属性值"。如果我对连接字符串进行硬编码就好了,就像你期望的那样。

open FSharp.Configuration
type Settings = AppSettings<"app.config">
let ConnStr = Settings.ConnectionStrings.Model
type private Connection = SqlEntityConnection<ConnectionString=ConnStr, Pluralize = true>
我做错了什么?这样做会有不同的## F#方式&#34;吗?

1 个答案:

答案 0 :(得分:5)

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

现在,问一下问题:在编译时是ConnStr知道吗? 不,当然不是,因为你想从配置文件中解除它。

您应该采用的方式是:

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