2012-04-04 21 views
0

それはクライアントサーバアーキテクチャの問題のようなものです。共有DBアクセス方法

私のソリューションには2つのプロジェクトがあります.1つはエンティティフレームワークとSQL Server Compactデータベースで作業するクライアント側のプロジェクトと、もう1つはエンティティフレームワークでも実際のSQL Serverデータベースで作業するサーバー側のプロジェクトです。どちらのデータベースもまったく同じデータベーススキーマを持っているため、異なる.edmxファイルを使用していますが、生成されたエンティティは同じように見え、名前空間だけが異なります。ところで、ADO.NET DbContext Generatorを使用して、永続性を知らないエンティティクラスを生成しています。ここまでは順調ですね。今、私は例えば、内部のすべてのサーバーのデータベースへのアクセス方法と(かなり大きい)クラスを書いた:

public User CreateUser(string userId, string username, bool isGlobalAdmin) 
    { 
     using (var context = new ServerEntities()) 
     { 
      try 
      { 
       var user = new User 
       { 
        UserID = userId, 
        Username = username, 
        IsGlobalAdmin = isGlobalAdmin 
       }; 

       context.User.Add(user); 
       context.SaveChanges(); 

       return user; 
      } 
      catch (Exception ex) 
      { 
       HandleEfException(ex); 
      } 
     } 

     return null; 
    } 

問題は、私は、クライアント側で同じ方法で同じクラスが必要だということです。したがって、このクラスをクライアントプロジェクトにコピーし、ServerEntitiesの名前をClientEntitiesに変更し、クライアントエンティティを使用するための名前空間を変更します。何かが変わった場合、私は両方のクラスを維持する必要があるので、これはかなり醜いです。全体を抽象化し、両側(クライアントとサーバー)に同じクラス(他の2つのプロジェクトが参照する別のプロジェクトにあります)を使用する方法はありますか?

本当にありがとうございます。

ベスト、

アントニー

答えて

0

データベースが同一であることが保証されている場合、なぜ両方のエンティティが必要ですか? 1つのセットだけを使用して、相互運用可能にしてください。

+0

あなたの答えをありがとう、デイビッド。自分のシナリオでも可能かどうかはわかりませんでしたが、うまくいきました。生成されたすべてのエンティティを内部に持つ別々のプロジェクトを作成しました。私はまた、自動生成されたものを使うのではなく、私自身のDbContextクラスを書きました。このプロジェクトには、すべてのデータベースアクションを含むクラスも含まれています。このクラスのコンストラクターでは、サーバーとクライアントのどちらかを選択できるので、すべてのメソッドが特定のデータベースに正しい接続文字列を使用しています。それは魅力のように動作します:)再びありがとう、David! – Antony

0

次の操作を行うことができます

#if SERVER 
    using (var context = new ServerEntities()) 
#elif CLIENT 
    using (var context = new ClientEntities()) 
#endif 

その後、両方のプロジェクトのためのプロジェクトのプロパティで、ビルドして、条件付きコンパイルに記号ボックスの下に、次のことができますそれぞれのトークンを追加します。そのため、サーバープロジェクトで、SERVERを追加して、クライアントで、CLIENTを追加します。すでにトークンがある場合は、セミコロン(;)で区切ります。

どのクラスのプロジェクトでも、2番目のプロジェクトへのリンクとして追加します。たとえば、クラスファイルがサーバープロジェクトに存在する場合、クライアントプロジェクトでは、[追加] - > [既存の項目]に移動します。ファイルを選択し、矢印をOpenでクリックし、[リンクとして追加]をクリックします。これにより、両方のプロジェクトに1つのコピーのみがリンクされていることが保証されます。

それぞれがコンパイルされると、コンパイラはトークンを調べて評価し、クライアントプロジェクトのClientEntities行とサーバープロジェクトのServerEntitiesを使用します。

必要に応じて、名前空間に対して同じプリプロセッサディレクティブを実行できます。ディレクティブを説明するのはan MSDN articleです。

+0

アントニーは、私はあなたが新しいユーザーでご覧ください。これがあなたの質問に答えるなら、答えを受け入れるためにそれの横にある緑色のチェックマークを選択してください。 –

+0

あなたの答えをありがとう、クリス!私はそれを知らなかった、非常に興味深い。 – Antony

関連する問題