7

ドメインを複数のEntityFrameworkモデルに分割しています。複数のモデル(Lookupという名前)にまたがる共有エンティティがいくつかありますが、これらは、「 EntityFrameworkでの大規模モデルの操作」で説明されている方法を使用した「using」参照に置き換えられます。ただし、私の場合が少しユニークなのは、これらのモデルを複数のデータベース(モデルごとに1つ)に分割していることです。

共有エンティティの1つを共通DBに挿入する際に問題が発生しました。エラーで失敗しています:

IDが'Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup'のメンバーは、メタデータコレクションに存在しません。

それが参照しているその外部キーは、「共通DB」には存在しません。しかし、私は関係の反対側にあるエンティティ(ResidentialAddressという名前)とも連携していません。また、初期化された他のエンティティ(MembersDbという名前)を含むコンテキストもありません。ただし、両方のモデルは同じアセンブリにコンパイルされます。

LookupからResidentialAddressに移行するナビゲーションプロパティはありません。反対方向のナビゲーションプロパティがありますが(これは永続化されません-メモリ内でのみ使用されます)。

CommonDbコンテキストMetadataWorkspaceEntityConnectionMyforは、そのデータベースに必要なデータのSSDL / CDL/MSLのみで明示的に初期化されました。そのスキーマデータのセットで言及されている外部キーへの参照がないことを確認しました。

var metaAssembly = typeof(CommonDb).Assembly;
var schemaResources = new string[]
{ 
    String.Format("res://{0}/Common.ssdl", metaAssembly.FullName), 
    String.Format("res://{0}/Common.csdl", metaAssembly.FullName), 
    String.Format("res://{0}/Common.mdl", metaAssembly.FullName), 
}
MetadataWorkspace metadata = new MetadataWorkspace(schemaResources, new []{ metaAssembly });
EntityConnection connection = new EntityConnection(metadata, myDatabaseConnection);

考えられる手がかり:生成されたクラスに移動し、関連するモデル(MembersDb)からEdmRelationshipAttributeそれらのペアとともにすべての属性を削除すると機能します。EdmRelationshipNavigationPropertyAttribute

重要な質問:

  1. では、なぜEntity Frameworkは、スコープ内になく、レコードの挿入による影響も受けないエンティティの関係で何かをしようとしているのですか?

  2. 生成されたコードで上記の属性を削除してもらえるのはうれしいですが、ナビゲーションプロパティはそのままにしておきたいです。それを達成するためにCSDLを変更するにはどうすればよいですか?

注:「子」モデルの永続性は優先事項ではなく、現在のクロスDB外部キーの整合性でもありません。これらのデータベースはSQLCEを使用して永続化されますが、元々は単一のマスターSQLServerデータベースから生成されました。

4

1 に答える 1

7

モデルの各部分が個別のデータベースに書き込まれている場合、おそらくedmxファイルは相互に(エンティティまたはそれらに属していないエンティティとの関係について)認識していないはずです。

次のいずれかのアプローチを試してみてはどうでしょうか。
(各パーツで同じエンティティクラスを使用することになりますが、EFはそれらの間の接続を無視します。)

  1. edmxから「使用法」を削除し、自動生成をキャンセルして、自分でクラスを作成します。
  2. edmxから「使用法」を削除し、クラスの作成時に複数のedmxを読み取るようにt4テンプレートを変更します。
  3. edmxファイルを脇にコピーして、2セットのedmxを作成します。
    3.a. エンティティの自動生成にはセット#1を使用します。
    3.b. 「usings」を削除してセット#2を変更し、リポジトリクラス(オブジェクトセット)の生成に使用します。

これらのいずれかが機能するかどうかを教えてください。

頑張って、ダニー。

于 2011-04-08T17:29:28.437 に答える