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

32

我们有一个自定义函数AppSettings.GetConnectionString(),它始终被调用以确定应该使用哪个连接字符串。如何工作对讨论来说不重要。可以简单地说它返回一个连接字符串,我必须使用它。

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

public partial class SampleDataContext
{
    public SampleDataContext() : base(AppSettings.GetConnectionString()) { }
}

在使用设计器将表格拖放到图表中之前,我的代码可以正常运行。但是一旦将表格拖放到图表中,会发生以下几件事:

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

所有这些都是在我保存文件之前完成的!当我保存图表时,设计器文件将被重新创建,并且它将包含自己的默认构造函数,该构造函数使用错误的连接字符串。这意味着我的 DataContext 现在有两个默认构造函数,我无法再编译代码了!

我可以撤消所有这些问题,但这很麻烦。每次更改后,我都必须手动删除连接字符串和新文件!

有没有办法阻止设计器在未经询问时进行这些更改?

编辑

在开发过程中,我被要求使用 AppSettings.GetConnectionString() 方法。我以前使用的方法与它生成的方法非常相似。现在有很多地方调用默认构造函数。我知道我可以将它们全部更改为以另一种方式创建数据上下文(使用不同的构造函数、静态方法、工厂等)。这种更改只会略微麻烦,因为只需要做一次。但是,我认为这是回避了真正的问题。dbml 文件和配置文件仍将包含一个不正确(如果未使用),可能会使其他开发人员困惑的连接字符串。


你在自动生成的 .cs 文件中创建了部分类吗? - zerkms
不,我在它自己的文件中创建了它。如果它在自动生成的文件中,那么它将替换我的构造函数。这样我就不会得到编译器错误,但它也不会使用我的方法。 - drs9222
尽管我完全理解这个问题是在我将其标记为重复问题之前提出的,但我这么做是因为那个问题有一个适用于此问题的正确工作解决方案。 - Sheridan
3个回答

23

在 DBML 的设计师中,您可以右键单击任何空白处,然后单击“属性”(与右键单击 DBML 文件并单击“属性”不同)。

从那里,展开“连接”选项。将“应用程序设置”设置为 False 并清除“连接字符串”设置。这些设置是设计师用来创建默认构造函数的依据。

完成后,您可以在 designer.cs 文件之外使用您创建的默认构造函数。遗憾的是,每当您向设计师中添加任何新表格时,都需要重复此过程。这很烦人,我了解您的痛苦。


5
这正是我所做的。我只是希望找到一种摆脱疼痛的方法。 - drs9222
1
我有一种感觉,我们都经历了相同的研究,最终发现自己处于同样的位置。这太糟糕了,我真的希望有一种简单的方法可以永久禁用这些设置,但不幸的是没有。 - drovani
1
我做同样的事情(然后我必须去除App.Config或Web.Config中的连接字符串)。然而,我找到了一个解决方法,那就是继承DataContext类。在我的继承类中,我将逻辑放在默认构造函数中,以动态获取我的连接字符串详细信息。 - Armstrongest

2
你可以使用类似SqlMetal的工具来生成自己的DataContext设计器文件,但你是对的,默认的DataContext非常难以打开。
另一个选择是从工厂方法中获取你的DataContext,这样你就可以隐藏实际使用的构造函数。如果你通过诸如Castle Windsor之类的IoC框架来实现,那么效果更佳。然后,你就能做到像这样的事情:
var context = container.Resolve<DataContext>();

Visual Studio不是使用SqlMetal从dbml文件生成设计器文件吗?你的意思是我可以使用SqlMetal从数据库生成dbml吗?虽然我知道这是可能的,但有太多的事情不能正确地生成。 - drs9222
哦,我可能有些困惑 - SqlMetal和T4一样吗? 我以为DataContext designer.cs文件是用T4模板生成的? 关键是,您可以拥有自己的自定义模板或代码生成器,但这很费力,而我建议的工厂解决方案更易于维护(并且意味着您能够获得L2S的新版本/补丁的好处)。 - Neil Barnwell
CastleWindsor如何知道要传递哪个连接字符串给DataContext? - reggaeguitar

1

这有点“hacky”,但您可以向构造函数添加一个参数(未使用的参数?),并在所有地方使用此构造函数,设计师创建的默认构造函数将不会引起任何问题。


应该已经有一个构造函数,它接受连接字符串作为参数,我可以通过调用我的方法来调用它。请参见我的编辑,了解我为什么不想走这条路。 - drs9222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接