0

我有一个 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){}
}

更新

我以这种方式解决了我的需求:

我重命名了生成的 projekteEntitites 类...

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){}
}

...现在我不会意外地使用默认构造函数调用原始生成的上下文。

感谢您的其他建议,也将看看它们(-:

4

1 回答 1

0

如果您已经在代码中同时管理发布和调试连接字符串,请在 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

于 2013-02-22T16:36:53.703 回答