2011-07-09 3 views
1

私はデフォルトのテンプレートのテーブルを持っています。すべてのユーザーに共通です。ユーザーがカスタムテンプレートを持っていない場合は、デフォルトをプルします。ユーザーがテンプレートをカスタマイズすることを決めた場合、globaltempaltesテーブルではなくcustomtemplatesテーブルに保存する必要があります。 カスタムテーブルには、すべてのglobaltemplatesフィールドと、それが置き換えられるグローバルに関するユーザIDとIDがあります。デフォルトとエンティティフレームワークを使用したカスタム

これをもう少し詳しく説明すると、3つのテンプレートがあり、テンプレート2のみをカスタマイズしたいとします。私は通常、globaltemplatesテーブル全体と、customtemplatesテーブルのユーザに関係するものすべてを取得します。その後、クラスのプロパティに私はこのように取得して何かをしたい:

MyTemplateA 
get { return customtemplates.A ?? globaltemplates.A; } 

私はPOCOせずにこの使用してストレートEF4/LINQを行うことができますか? 上記のgetのようないくつかの追加のプロパティを持つ部分クラスはありますか?

私は常にcustomtemplatesテーブル(追加/編集/削除)のみを編集しているので、どのバージョンのテンプレートをプルするかは関係ありません。私はそれが挿入物か更新であるかどうか把握している毛深い得ることができると思います。

答えて

1

EFがエンティティをテーブルに密接に関連付けるので、私の意見では、期待通りに動作しません。スプリットや継承のような非常に特殊な状況を除き、単一のエンティティを2つのテーブルにマップすることはできません。

したがって、Templateエンティティがある場合、それは単一のテーブルにのみマッピングできますが、2つのエンティティがあります。あなたができることは、TemplateGlobalTemplatesテーブルにマップされた基本エンティティになり、UserTemplateUserTemplatesテーブルにマップされた派生エンティティになるTPC継承を使用することです。 TPC(具体的なテーブルタイプ)は継承のタイプで、派生エンティティのテーブルには親エンティティのテーブルのすべてのカラムが含まれます。

しかし、継承はまだあなたのシナリオのいくつかの問題があります:

  • Templateは編集可能です - あなたはそれはあなたが正しくあなたのアプリケーションロジックでそれを処理する必要があります読み取り専用にしたい場合。文脈でSaveChangesを呼び出すと、添付されたTemplateインスタンスへの変更は保存されます。
  • Templateをロードすると、それを直接UserTemplateに変換してユーザー固有のものにすることはできません。 UserTemplateの新しいインスタンスを作成し、Templateから新しく作成したインスタンスにプロパティをコピーする必要があります。
+0

これは別の方法で解決できますか?ユーザー作成時には、グローバルテンプレートがユーザーテンプレートテーブルにコピーされます。次に、1つのオブジェクトのみを扱うことになります。より多くのオーバーヘッドが、より単純なオブジェクトです。私がここで伝えているどんなパターンもまれなケースではないと思います。 – abend

+0

ユーザーが各テンプレートのコピーを持っていても、変更を加えたくない場合でも、それは良い方法です。 –

関連する問題