0

これは一種のクライアント サーバー アーキテクチャの問題です。

私のソリューションには 2 つのプロジェクトがあります。1 つは Entity Framework と SQL Server Compact データベースを操作するクライアント側のプロジェクトで、もう 1 つは Entity Framework を操作するが実際の 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 つのプロジェクトが参照する別のプロジェクトにある) を両側 (クライアントとサーバー) で使用する方法はありますか?

よろしくお願いします。

一番、

アントニー

4

2 に答える 2

0

次のことができます。

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

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

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

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

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

于 2012-04-04T16:17:25.600 に答える
0

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

于 2012-04-04T16:37:33.237 に答える