F# 项目需要花费大量时间来构建
F# project is taking so much time to build
我创建了 f# 解决方案并添加了一个 class 库。解决方案只有一个项目,5个文件,每个文件20行代码。每次构建仍然需要多2分钟。
我试过清理解决方案。
还创建了新的解决方案和项目并包含相同的文件,但构建它仍需要相同的时间。
注意:首先我将其创建为控制台应用程序,然后将其转换为 Class 库。
编辑:代码示例`
打开系统
打开配置
打开 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
模块配置=
让 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`
This answer 关于 NGEN 帮了我一次,但 F# 的构建时间与 C# 相比仍然很糟糕,只是不到几分钟。
好的,看到你的实际代码,我认为主要问题是类型提供程序每次都连接到数据库以检索架构。解决此问题的方法是将架构缓存在 dbml 文件中。
type dbSchema = SqlDataConnection<"connection string...",
LocalSchemaFile = "myDb.dbml",
ForceUpdate = false>
第一次,TP 会像往常一样连接到数据库,但也会将模式写入 myDb.dbml
。在随后的编译中,它将从 myDb.dbml
加载模式而不是连接到数据库。
当然,这种缓存意味着对数据库的更改不会反映在类型中。所以每次你需要从数据库重新加载模式时,你可以将 ForceUpdate
设置为 true
,进行编译(这将连接到数据库),然后将其设置回 false
使用更新后的 myDb.dbml
.
编辑:如果需要,您甚至可以将 dbml
文件提交到您的源存储库。这将带来额外的好处,即允许无法访问数据库开发版本的协作者无论如何都可以编译解决方案。
我创建了 f# 解决方案并添加了一个 class 库。解决方案只有一个项目,5个文件,每个文件20行代码。每次构建仍然需要多2分钟。
我试过清理解决方案。 还创建了新的解决方案和项目并包含相同的文件,但构建它仍需要相同的时间。
注意:首先我将其创建为控制台应用程序,然后将其转换为 Class 库。
编辑:代码示例`
打开系统 打开配置 打开 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
模块配置= 让 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`
This answer 关于 NGEN 帮了我一次,但 F# 的构建时间与 C# 相比仍然很糟糕,只是不到几分钟。
好的,看到你的实际代码,我认为主要问题是类型提供程序每次都连接到数据库以检索架构。解决此问题的方法是将架构缓存在 dbml 文件中。
type dbSchema = SqlDataConnection<"connection string...",
LocalSchemaFile = "myDb.dbml",
ForceUpdate = false>
第一次,TP 会像往常一样连接到数据库,但也会将模式写入 myDb.dbml
。在随后的编译中,它将从 myDb.dbml
加载模式而不是连接到数据库。
当然,这种缓存意味着对数据库的更改不会反映在类型中。所以每次你需要从数据库重新加载模式时,你可以将 ForceUpdate
设置为 true
,进行编译(这将连接到数据库),然后将其设置回 false
使用更新后的 myDb.dbml
.
编辑:如果需要,您甚至可以将 dbml
文件提交到您的源存储库。这将带来额外的好处,即允许无法访问数据库开发版本的协作者无论如何都可以编译解决方案。