ドメインを複数のEntityFrameworkモデルに分割しています。複数のモデル(Lookupという名前)にまたがる共有エンティティがいくつかありますが、これらは、「 EntityFrameworkでの大規模モデルの操作」で説明されている方法を使用した「using」参照に置き換えられます。ただし、私の場合が少しユニークなのは、これらのモデルを複数のデータベース(モデルごとに1つ)に分割していることです。
共有エンティティの1つを共通DBに挿入する際に問題が発生しました。エラーで失敗しています:
IDが'Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup'のメンバーは、メタデータコレクションに存在しません。
それが参照しているその外部キーは、「共通DB」には存在しません。しかし、私は関係の反対側にあるエンティティ(ResidentialAddressという名前)とも連携していません。また、初期化された他のエンティティ(MembersDbという名前)を含むコンテキストもありません。ただし、両方のモデルは同じアセンブリにコンパイルされます。
LookupからResidentialAddressに移行するナビゲーションプロパティはありません。反対方向のナビゲーションプロパティがありますが(これは永続化されません-メモリ内でのみ使用されます)。
CommonDbコンテキストMetadataWorkspace
のEntityConnection
Myforは、そのデータベースに必要なデータの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
重要な質問:
では、なぜEntity Frameworkは、スコープ内になく、レコードの挿入による影響も受けないエンティティの関係で何かをしようとしているのですか?
生成されたコードで上記の属性を削除してもらえるのはうれしいですが、ナビゲーションプロパティはそのままにしておきたいです。それを達成するためにCSDLを変更するにはどうすればよいですか?
注:「子」モデルの永続性は優先事項ではなく、現在のクロスDB外部キーの整合性でもありません。これらのデータベースはSQLCEを使用して永続化されますが、元々は単一のマスターSQLServerデータベースから生成されました。