防止“;使用“;通过使用框架类中的特定构造函数

本文关键字:构造函数 使用 防止 框架 | 更新日期: 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