私のデータモデルでは、オブジェクト/テーブル/データ間でかなり一般的な区分があります。
- システムによって実行されている作業を表す「トランザクション」エンティティ。これらのエンティティはシステムによって作成され、特定のコンテキストでのみ重要です。それらは定期的にその場で作成されます。(余談ですが、このタイプのエンティティには適切な名前がありますか?)
- トランザクションエンティティの共通プロパティを表す「データディクショナリ」エンティティ。これらは不規則に定義され(主にプロジェクトの開始時に)、はるかに静的なライフサイクルを持っています。それらは通常私によって作成されます。
したがって、たとえば、User(トランザクション)エンティティとUserType(データディクショナリ)エンティティがあるとします。
データディクショナリエンティティのインスタンスへの参照をコードに(ハード)コード化したい。これにより、理解しやすい言語でビジネスロジックをコーディングできるようになります。(たとえば、UserTypeが「Plain」でUserTypeが「Admin」で、「ユーザーのUserTypeがAdminと等しい場合にのみアクセスを許可する」というルールがあるとします)。
データアクセステクノロジ/ORMとしてLINQ-to-Entitiesを使用しています。データディクショナリ参照を実装するために、EntityKeysを保存しています。私の理解では、それらはオブジェクトコンテキストから切り離されているため、この目的に適しています。(エンティティの状態が含まれていないため、その状態が古くなることを心配する必要もありません。)
ただし、DD-EntityKey-referenceを使用して新しいトランザクションエンティティを追加しようとすると、問題が発生します。私の例を続けて、私はこれをやっています:
UserEntities userEntities = new UserEntitites()
User user = new User()
user.UserType = new UserType()
user.UserType.EntityKey = adminEntityKey
userEntities.AddToUser(user)
...そしてこれは私に次のエラーを与えます:
System.InvalidOperationException:オブジェクトにはすでにEntityKeyがあるため、オブジェクトをObjectStateManagerに追加できません。ObjectContext.Attachを使用して、既存のキーを持つオブジェクトをアタッチします。
AddToUserの代わりにuserEntities.Attach(user)を呼び出そうとすると、次のようになります。
System.InvalidOperationException:EntityKey値がnullのオブジェクトは、オブジェクトコンテキストにアタッチできません。
私が行っている新しいエンティティと既存のエンティティが混在していることを考えると、これらのエラーは両方とも理にかなっています。私がよくわからないのは、この問題を回避する方法です。DDエンティティの状態全体をロードしなくても、DDエンティティへの参照を切り離して、それらを新しいアタッチされたオブジェクトに割り当てる方法はありますか?