C# 使用Linq到SQL在本地和远程之间切换“ConnectionString”

C# 使用Linq到SQL在本地和远程之间切换“ConnectionString”,c#,.net,linq-to-sql,datacontext,data-access-layer,C#,.net,Linq To Sql,Datacontext,Data Access Layer,首先,我所说的远程是指我们网络上的中央专用SQL Server。所谓本地,我指的是本地SQL Express安装 我的情况只是在家里。没有云服务、外部站点等。我的应用程序允许用户在断开连接的情况下工作,但为了最大限度地减少流量和其他一些问题,我希望允许他们在中央服务器可用时自动连接到中央服务器和/或当他们设置选择中央服务器时直接连接到中央服务器 安装非常简单。每个人的本地连接字符串都是这样--> 数据源=。\SQLEXPRESS;初始目录=MemberCenteredPlan;集成安全=真 和一

首先,我所说的远程是指我们网络上的中央专用SQL Server。所谓本地,我指的是本地SQL Express安装

我的情况只是在家里。没有云服务、外部站点等。我的应用程序允许用户在断开连接的情况下工作,但为了最大限度地减少流量和其他一些问题,我希望允许他们在中央服务器可用时自动连接到中央服务器和/或当他们设置选择中央服务器时直接连接到中央服务器

安装非常简单。每个人的本地连接字符串都是这样-->

数据源=。\SQLEXPRESS;初始目录=MemberCenteredPlan;集成安全=真

和一个中央SQL连接字符串,如-->

数据源=CentralSQL;初始目录=MemberCenteredPlan;集成安全=真

此外,我的数据与我的UI在一个单独的项目中,因此我很难弄清楚如何从UI层的数据层访问设置文件

我应该为所有方法添加一个参数并向它们传递一个IsOnline变量吗?似乎是重复的,但如果我知道一个更好的方式,我不会张贴在第一位

谢谢你的帮助


但我想知道当我想在运行时在本地数据库和远程数据库之间切换时,建议是否有所不同。

在这种情况下,我使用的一个选项是在DataContext(在分部类中)上创建一个方法:

public static DataContext New
{
  get
  {
    var cs = IsConnected ? CentralConnectionString : LocalConnectionString;
    return new DataContext(cs);
  }
}
你可以加强开关逻辑,无论你想如何自动切换。然后要在代码中引用,只需使用如下格式:

var DB = DataContext.New;
var result = from a in DB.....
public static bool IsConnected 
{ 
  get 
  {
       return ConfigurationManager.AppSettings["Online"] == "true";
  }
}

它使您的datacontext创建逻辑保持在一个位置,如果它适合您的需要,我发现它可以简化任何地方的事情。

要回答您在对Nick答案的评论中提出的问题,他的
已连接
是添加到分部类的属性。您可以用任何方法定义它来确定程序中的状态。如果它是一个AppSetting值,它将是这样的:

var DB = DataContext.New;
var result = from a in DB.....
public static bool IsConnected 
{ 
  get 
  {
       return ConfigurationManager.AppSettings["Online"] == "true";
  }
}

听起来不错,不过我想我错过了一些东西<代码>断开连接…我会在UI中设置,可能的话,你会怎么做?我本想把它和应用程序设置联系起来,但我似乎无法从数据层访问它。“我会把它传给每一个呼叫吗?”折射圣骑士-你可以随意访问它,不管它是自动决定的还是像詹姆斯的回答一样有效。你根本不需要传递它,只是以静态的方式获取它
ConfigurationManager.AppSettings
是使用AppSettings方法的最简单的选择。当我第一次读到这篇文章时,我认为您的意思是为我的每个数据上下文(ConnectDataContext、CMODataContext、MCPDataContext)创建一个分部类,对吗?否则,您是否打算让我为
System.Data.Linq.DataContext
创建分部类?@Refracted-您不能为System.Data.Linq.DataContext创建分部类,但是…您有2个选项。为每个上下文创建一个分部,或者创建一个继承自
System.Data.Linq.DataContext
的类,添加此属性,让您的上下文继承自该类(您可以使用Linq T4模板进行此更改,例如,您可以在此处找到这些模板:)。谢谢,这就是我所想的,但我遇到了一些问题。现在我知道我的问题与其他事情有关。我可能会最后发布另一个问题,因为当我设置L2S数据层时,看起来我一定做了些傻事……谢谢你的帮助!谢谢你回答我的评论问题。很抱歉,我将启动一个新线程,因为它实际上是一个用户设置,我似乎无法使用ConfigurationManager在数据层访问它。谢谢你的指导。