防止“;使用“;通过使用框架类中的特定构造函数
本文关键字:构造函数 使用 防止 框架 | 更新日期: 2023-09-27 18:00:29
我有一个wpf应用程序,并使用EF4与数据库通信。我动态地选择连接字符串,这取决于调试器是否连接:
public static string CustomerConnectionString;
public static string ProjectsConnectionString;
private static void GetConnectionstring()
{
if (Debugger.IsAttached)
{
CustomerConnectionString = ConfigurationManager.ConnectionStrings["kundenEntities"].ConnectionString;
ProjectsConnectionString = ConfigurationManager.ConnectionStrings["projekteEntities"].ConnectionString;
}
else
{
CustomerConnectionString = ConfigurationManager.ConnectionStrings["kundenEntitiesRelease"].ConnectionString;
ProjectsConnectionString = ConfigurationManager.ConnectionStrings["projekteEntitiesRelease"].ConnectionString;
}
}
我这样做是为了确保不会意外地在生产数据库中做一些事情。
这样就创建了一个实体对象:
using (ProjectEntities proj = new ProjectEntities(App.ProjectsConnectionString))
{
I'm proper code
}
现在我想确保,我不会意外地调用默认构造函数来获取实体对象。这将导致实体对象使用app.config中的默认连接字符串。默认连接字符串是连接到本地数据库的调试连接字符串。应该清楚的是,如果发生这种情况,从该实体查询的数据正在我的调试器中工作,但对用户不起作用,因为该用户没有连接到我的本地数据库(-:
我现在做了一个变通方法,派生了实体类,并只提供了需要连接字符串的构造函数:
public class ProjectEntities : projekteEntities
{
public ProjectEntities(string connectionString) : base (connectionString){}
}
更新
我用这种方式解决了我的需求:
我将生成的项目重命名为Entitites类。。。
public partial class ObsoleteProjekteEntities : ObjectContext
{
#region Konstruktoren
/// <summary>
/// Initialisiert ein neues projekteEntities-Objekt mithilfe der in Abschnitt 'projekteEntities' der Anwendungskonfigurationsdatei gefundenen Verbindungszeichenfolge.
/// </summary>
public ObsoleteProjekteEntities() : base("name=projekteEntities", "projekteEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
/// <summary>
/// Initialisiert ein neues projekteEntities-Objekt.
/// </summary>
public ObsoleteProjekteEntities(string connectionString) : base(connectionString, "projekteEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
/// <summary>
/// Initialisiert ein neues projekteEntities-Objekt.
/// </summary>
public ObsoleteProjekteEntities(EntityConnection connection) : base(connection, "projekteEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
并派生出该类。。。
public class ProjectEntities : ObsoleteProjekteEntities
{
public ProjectEntities(string connectionString) : base (connectionString){}
}
现在,我不会意外地用默认构造函数调用原始生成的上下文。
感谢您的其他建议,我们也会看看(-:
如果您已经在代码中管理发布和调试连接字符串,请在web.config文件中注释掉连接字符串。更好的是,使用.config文件转换工具来完成此操作。看看这个教程。
其次,不要依赖编码程序来处理每次使用的连接字符串。不要使用Debugger.IsAttached
来决定调试模式和发布模式。如果有人在没有调试器的情况下运行应用程序,它将访问发布数据库。而是使用C#预处理器指令。
例如:
- 转到项目属性
- 转到
Build
选项卡 - 检查
Define DEBUG constant
- 转到要设置连接字符串的文件,并使用以下代码:
#if DEBUG
CustomerConnectionString = ConfigurationManager.ConnectionStrings["kundenEntities"].ConnectionString;
ProjectsConnectionString = ConfigurationManager.ConnectionStrings["projekteEntities"].ConnectionString;
#else
CustomerConnectionString = ConfigurationManager.ConnectionStrings["kundenEntitiesRelease"].ConnectionString;
ProjectsConnectionString = ConfigurationManager.ConnectionStrings["projekteEntitiesRelease"].ConnectionString;
#endif