1

我看到几个 DataContext 连接字符串问题。我将尝试区分这一点:

  1. 如何构造一个到数据库 localhost 的通用连接字符串?用户-PC\用户 | 一些数据库...(由 Microsoft SQL 2008 托管/管理)

  2. 我注意到它是 IDisposable。因此,如果我有多个用户访问我的站点,我的代码一次只能访问一个数据库实例,并且必须等到每个实例都被释放,才能使每个用户的数据保持一致?

  3. 是否有可能以某种方式在 F#-Interactive 中启用 LINQ,并从那里连接到数据库?我无法弄清楚如何将 System.Data dll 启用/加载到 fsi 中。也许这是我的安装所独有的,或者它是一个共同的线程?(即,我的安装也无法识别 windows.base.dll——我必须从程序\参考程序集中手动获取它)。

无论如何,我已经非常明确地发现

let x = new System.Data.Linq.DataContext("localhost") 

...不起作用。

4

3 回答 3

2

1)如何构造一个到数据库的通用连接字符串?

没有通用的方法来构造连接字符串。最好的办法是将连接字符串保存在某个配置文件中,您可以在其中根据您的配置(SQL Server 机器的名称、身份验证选项、它是基于文件的数据库还是普通数据库)来更改它。有一个网站提供了大多数选项的示例

2)我注意到它是 IDisposable。因此,如果我有多个用户访问我的网站,我的代码一次只能访问一个数据库实例 [...]?

不,这不是DataContext工作方式。DataContext不会保持与服务器的实时连接,这会阻止其他任何人使用 SQL 服务器。它保留一些状态(即已经获得的缓存实体)并使用乐观并发来确保状态是一致的(如果您想要的话,您可以使用事务来阻止其他连接)。

3) 是否有可能以某种方式在 F#-Interactive [...] 中启用 LINQ?

那应该不是问题。#r "foo.dll"您可以在 F# 交互中使用引用程序集。F# 2.0 的典型方法是使用 C# 工具生成数据上下文,然后引用它(对于 F# 3.0,事情更容易,因为您可以使用类型提供程序)。

如果您在 C# 中生成 LINQ to SQL 数据上下文Northwind,则 F# Interactive 使用将如下所示:

#r @"<whatever_path>\Northwind.dll"
#r "System.Data.Linq.dll"

open Northwind
open Microsoft.FSharp.Linq

let connStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=<path>\NORTHWND.MDF;" +
              @"Integrated Security=True;User Instance=True"

let operation () =
   // Using 'use' to make sure it gets disposed at the end
   use db = new NorthwindDataContext(connStr)
   // do something with the database
于 2012-05-08T13:11:11.400 回答
0

实际上有一种构造连接字符串的通用方法:

open System.Data.Common
open System.Data.SqlClient

let providerName = "System.Data.SqlClient"
let factory = DbProviderFactories.GetFactory(providerName)
let cnBuilder = factory.CreateConnectionStringBuilder() :?> SqlConnectionStringBuilder
cnBuilder.DataSource <- "localhost"
cnBuilder.InitialCatalog <- "MyDatabase"
cnBuilder.IntegratedSecurity <- true
let connStr = cnBuilder.ConnectionString
于 2012-05-08T18:23:54.287 回答
0

我的方法是拥有 1 个连接字符串,然后将其用于我的所有 DataContext 连接。所以这段代码基于 MyConnString 构建了 EntityConnectionString:

protected override MyEntities CreateObjectContext()
   {
      string ConnString =ConfigurationManager.ConnectionStrings["MyConnString"];

      string seConn = ConfigurationManager.ConnectionStrings["MyEntities"].ToString();

      EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder(seConn);
      ecsb.ProviderConnectionString = ConnString;

      EntityConnection ec = new EntityConnection(ecsb.ToString());

      ScheduleEntities ctx = new ScheduleEntities(ec);

      return ctx;

}
于 2012-05-09T17:43:55.437 回答