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 に答える