我可以阻止dbml设计器向dbml文件添加连接字符串吗?

drs*_*222 30 c# datacontext connection-string linq-to-sql

我们有一个自定义函数AppSettings.GetConnectionString(),它总是被调用来确定应该使用的连接字符串.这个功能如何工作对讨论来说并不重要.它足以说它返回一个连接字符串,我必须使用它.

我希望我的LINQ to SQL DataContext使用这个,所以我从dbml文件中删除了所有连接字符串信息并创建了一个带有默认构造函数的分部类,如下所示:

public partial class SampleDataContext
{
    public SampleDataContext() : base(AppSettings.GetConnectionString()) { }
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,直到我使用设计器将表拖放到图表中.将表拖入图表的行为将执行以下几项不必要的操作:

  • 将创建一个设置文件
  • 将创建一个app.config文件
  • 我的dbml文件将嵌入连接字符串

所有这一切都在我保存文件之前完成!

当我保存图表时,将重新创建设计器文件,它将包含自己的默认构造函数,该构造函数使用错误的连接字符串.当然这意味着我的DataContext现在有两个默认构造函数,我不能再构建了!

我可以撤消所有这些坏事,但这很烦人.我必须在每次更改后手动删除连接字符串和新文件!

无论如何我可以阻止设计师在不问的情况下做出这些改变吗?

编辑

使用这种AppSettings.GetConnectionString()方法的要求在游戏的后期很晚.我曾经使用过类似于它为我生成的东西.有很多地方调用默认构造函数.我知道我应该将它们全部更改为以另一种方式创建数据上下文(使用不同的构造函数,静态方法,工厂等).这种变化只会有点烦人,因为它只需要做一次.但是,我觉得,它正在回避真正的问题.dbml文件和配置文件仍然包含一个不正确的(如果未使用的)连接字符串,这最多可能会使其他开发人员感到困惑.

dro*_*ani 22

在DBML的设计器中,您可以右键单击任何空白区域,然后单击"属性"(与右键单击DBML文件并单击"属性"不同).从那里,展开"连接"选项.将"应用程序设置"设置为False并清除"连接字符串"设置.这些设置是设计人员用来创建默认构造函数的设置.

从那里,您可以使用您在designer.cs文件之外创建的默认构造函数.不幸的是,每次向设计人员添加任何新表时,都必须重复此过程.这很烦人,我感觉到你的痛苦.

  • 这正是我所做的.我只是希望找到摆脱痛苦的方法. (5认同)

Nei*_*ell 2

您可以使用SqlMetal之类的工具来生成您自己的 DataContext 设计器文件,但您是对的 - 默认情况下 DataContext 很难打开。

您的另一个选择是从工厂方法获取 DataContext,以便您可以隐藏实际使用的构造函数。如果通过像 Castle Windsor 这样的 IoC 框架来做到这一点就更好了。然后你就可以做类似的事情:

var context = container.Resolve<DataContext>();
Run Code Online (Sandbox Code Playgroud)