0

私には2つのエンティティがあります。それらを人と住所と呼びましょう。個人の現在の住所は1つだけです[ここに政治家候補についてのジョークを挿入]が、以前の住所もあり、これらも住所テーブルに保存されます。したがって、データベーステーブルに1対多の関係を持たせたいと思います。

ただし、エンティティクラスでは、PersonとAddressの間に1:manyの関係は必要ありません。これは、現在の住所にのみ関心があるためです。(以前の住所について知りたい場合は、住所テーブルを直接確認できます)。したがって、Personオブジェクトに1:manyの「Addresses」プロパティは必要ありません。代わりに、現在のアドレスに設定する1:1のアドレスプロパティが必要です。

これはできますか?

4

2 に答える 2

2

EFリレーションはDBリレーションに厳密に従うため、マッピングを介してこれを行うことはできません。さらに、EFの1対1の関係は、従属テーブルの主キーに外部キーを配置することに基づいており(住所と人はまったく同じ主キー値を持っている必要があります)、この要件は、テーブルも。

私はこのアプローチを試します(テストされていません):

public class MyContext : DbContext {

    public MyContext() {
        ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
            (sender, e) => {
                var person = e.Person as Person;
                if (person != null) {
                    // Fill the property manually
                    person.Address = this.Addresses.FirstOrDefault(/* some condition */);
                }
    }

    protected override void OnModelCreating(DbModelBuilder builder) {
        // Do not map the propery
        builder.Entity<Person>().Ignore(p => p.Address);

        // other mapping
    }

    public override int SaveChanges() {

        // TODO: here you must have your own change tracking logic
        // for address to know when the address has changed and 
        // new record must be created in the database for old address

        return base.SaveChanges();
    }

    // rest of context class
}
于 2012-10-12T17:39:34.420 に答える
0

いいえ、できません。ナビゲーションプロパティは外部キー関係を表し、データベースのFK関係は1人の多くのアドレスを表します。現在のアドレスは、データベース内の特定のクエリの結果です。たとえば、「現在の」定義方法に応じて、特定の人物のすべてのアドレスに対する「select top(1)... orderbyaddresscreationdatedescending」クエリです。

私の意見では、考えられる解決策は次のとおりです。

  • CurrentAddressId現在のアドレスを参照するpersonテーブルの外部キーとの2番目の関係を作成します。CurrentAddress次に、クラスにナビゲーション参照を含めることができますPerson
  • GetCurrentAddress(Person person)または、クエリを実行して、メソッドなどを使用してリポジトリまたはサービスクラスの現在のアドレスをロードします。Personただし、その場合、クラスの現在のアドレスのナビゲーションプロパティを設定することはできません。
于 2012-10-12T17:39:22.580 に答える