我创建了f#解决方案并添加了一个类库。解决方案中只有一个项目,每个文件中有5个文件和20行代码。每次构建还需要2分钟。
我试图清理解决方案。 还创建了新的解决方案和项目并包含相同的文件,但仍然需要相同的时间来构建它。
注意:首先我将其创建为控制台应用程序,然后将其转换为类库。
编辑:代码示例`
打开系统 打开配置 打开DBUtil 打开定义
模块DBAccess =
let GetSeq (sql: string) =
let db = dbSchema.GetDataContext(connectionString)
db.DataContext.CommandTimeout <- 0
(db.DataContext.ExecuteQuery(sql,""))
let GetEmployeeByID (id: EMP_PersonalEmpID) =
GetSeq (String.Format("EXEC [EMP_GetEntityById] {0}",id.EmployeeID)) |> Seq.toList<EMP_PersonalOutput>
let GetEmployeeListByIDs (id : Emp_PersonalInput) =
GetSeq (String.Format("EXEC [EMP_GetEntityById] {0}",id.EmployeeID)) |> Seq.toList<EMP_PersonalOutput>`
配置代码片段:`open Microsoft.FSharp.Data.TypeProviders
模块配置= let connectionString = System.Configuration.ConfigurationManager.ConnectionStrings。[“EmpPersonal”]。ConnectionString
//for database,then stored procedure, the getting the context,then taking the employee table
type dbSchema = SqlDataConnection<"", "EmpPersonal">
//let db = dbSchema.GetDataContext(connectionString)
type tbEmpPersonal = dbSchema.ServiceTypes.EMP_Personal`
答案 0 :(得分:4)
好的,看到你的实际代码,我认为主要问题是类型提供程序每次都连接到数据库以检索模式。解决此问题的方法是将架构缓存在dbml文件中。
type dbSchema = SqlDataConnection<"connection string...",
LocalSchemaFile = "myDb.dbml",
ForceUpdate = false>
第一次,TP将像往常一样连接到数据库,但它也会将架构写入myDb.dbml
。在后续编译中,它将从myDb.dbml
加载架构,而不是连接到数据库。
当然,这种缓存意味着对数据库的更改不会反映在类型中。因此,每次需要从数据库重新加载模式时,可以将ForceUpdate
设置为true
,进行编译(将连接到数据库),然后将其设置回false
使用更新的myDb.dbml
。
编辑:如果需要,您甚至可以将dbml
文件提交到源存储库。这将有额外的好处,允许无法访问数据库开发版本的协作者编译解决方案。
答案 1 :(得分:2)
This answer关于NGEN曾经帮助过我一次,但与C#相比,F#的构建时间仍然很糟糕,而不是几分钟。