5

Entity Framework でドメイン駆動設計を実装するために、Julie Lerman が TechEd North America 2013 ( http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B336#fbid=4tnuPF6L-Jc ) で発表したアプローチを使用します。)。このアプローチでは、EF エンティティ クラスをドメイン クラスとして使用します。異なる境界付けられたコンテキストでは、ドメイン エンティティ クラスは異なるプロパティを持ち、異なる名前が付けられることさえありますが、データは同じテーブルに格納されます。例として、「顧客サービス」の境界コンテキスト内の顧客は、実際には「顧客」ですが、「配送」境界コンテキストでは、顧客プロパティのサブセットのみを持つ「受信者」です。境界付けられたコンテキストごとに、境界付けられたコンテキストが必要とするエンティティの DbSet のみを含む異なる EF コンテキストが存在します。OnModelCreating をオーバーライドすることで、境界付けられたコンテキストとは関係のない参照エンティティを除外することもできます。この部分は、POCO を使用して実装するのはかなり簡単です。

問題は、Code First を使用する場合のデータベースの作成です。Code First で異なる EF コンテキストごとにデータベースを作成すると、複数のデータベースが作成されます。EF コンテキストのコンストラクターでデータベース名を定義すると、データベースは最初に使用された EF コンテキストで作成され、2 番目の EF コンテキストが使用されると (エンティティが見つからない、プロパティが見つからないなど)、InvalidOperationException (モデルが変更されたことを示す) が発生します。以前は他の EF コンテキストになかったエンティティ/メンバーを使用する EF コンテキストが使用されている場合、移行を使用してデータベースを更新できる可能性があります。しかし、それは移行の通常の使用と間違いなく混同され、適切に機能しません。一時的な解決策として、データベースの作成のみに別の EF コンテキストを使用します。これは、この目的のためだけにすべての EF エンティティを再度実装する必要があることを意味します。

他の解決策があると確信しています。では、(ジュリー ) 方法を教えてください。

4

2 に答える 2

2

本質的に、すべての「テーブル」が定義され、移行を促進するマスターコンテキストが必要になると思います。このコンテキストは、データベースの作成に使用されるものです。

後続のすべての「境界付き」コンテキストでは、データベース スキーマの改ざんを防ぐために、コンストラクターに Database.SetInitializer(null) が含まれます。

さらに、マスター コンテキストと「境界付き」コンテキストの両方が、接続文字列などのセットを持つ抽象基本コンテキスト クラスから継承する必要があります。

アプリケーションの起動時に、マスター コンテキストのインスタンス化を試み、それが最新バージョンに移行されていることを確認するだけです。しかし、後で実際のアプリケーションでは、マスター コンテキストのサブセットのみを実装する「境界付き」コンテキストのみを使用します。

あなたはすでに一部または全体でこれを行っていることは承知していますが、それが進むべき道だと思います。

于 2014-02-08T12:22:26.230 に答える