我们有一个自定义函数AppSettings.GetConnectionString()
,它总是被调用来确定应该使用的连接字符串。这个功能如何工作对讨论来说并不重要。它足以说它返回一个连接字符串,我必须使用它。
我希望我的LINQ to SQL DataContext使用它,所以我从dbml文件中删除了所有连接字符串信息,并创建了一个带有默认构造函数的部分类,如下所示:
public partial class SampleDataContext
{
public SampleDataContext() : base(AppSettings.GetConnectionString()) { }
}
这可以正常工作,直到我使用设计器将表拖放到图表中。将表格拖入图表的行为将会执行一些不需要的操作:
所有这些都是在我保存文件之前完成的!
当我保存图表时,会重新创建设计器文件,它将包含自己的默认构造函数,该构造函数使用错误的连接字符串。当然这意味着我的DataContext现在有两个默认构造函数,我不能再构建了!
我可以撤消所有这些坏事,但这很烦人。我必须在每次更改后手动删除连接字符串和新文件!
无论如何,我可以阻止设计师在不问的情况下进行这些更改吗?
使用AppSettings.GetConnectionString()
方法的要求在游戏的后期很晚才被强加给我。我曾经使用过类似于它为我生成的东西。有很多地方调用默认构造函数。我知道我应该改变它们以另一种方式创建数据上下文(使用不同的构造函数,静态方法,工厂等)。这种变化只会有点烦人,因为它只需要做一次。但是,我觉得,它正在回避真正的问题。 dbml文件和配置文件仍然包含一个不正确的(如果未使用的)连接字符串,最多可能会使其他开发人员感到困惑。
答案 0 :(得分:22)
在DBML的设计器中,您可以右键单击任何空白区域,然后单击“属性”(与右键单击DBML文件并单击“属性”不同)。 从那里,展开“连接”选项。将“应用程序设置”设置为False并清除“连接字符串”设置。这些设置是设计人员用来创建默认构造函数的设置。
从那里,您可以使用您在designer.cs文件之外创建的默认构造函数。不幸的是,每次向设计人员添加任何新表时,都必须重复此过程。这很烦人,我感到很痛苦。
答案 1 :(得分:2)
您可以使用SqlMetal之类的东西来生成自己的DataContext设计器文件,但是你是对的 - 默认情况下,DataContext很难破解。
您的另一个选择是从工厂方法获取DataContext,以便隐藏实际使用的构造函数。如果你通过像Castle Windsor这样的IoC框架这样做,那就更好了。然后你就可以做以下事情:
var context = container.Resolve<DataContext>();
答案 2 :(得分:1)
这有点'hacky'但你可以在构造函数中添加一个参数(一个未使用的?),在任何地方使用这个构造函数,设计者创建的默认构造函数不会给你带来任何问题。