0

私はEFCodeFirstにかなり慣れていないので、これは(願わくば!)簡単な質問かもしれません。

私は人と住所の間に単純な関係があります:

People
------
PersonID
Name

Address
-------
AddressID
Address1
PersonID

ほとんどの場合、PeopleテーブルにAddressIDがあります。ただし、このデータベースは、PersonIDを参照するという点で、少し「逆方向」です。私のコードでは、Personオブジェクトを処理し、それらに関連付けられたアドレスを取得したいと考えています。関係は、多くの住所を持つ1人の場合もありますが、常に1:1です。(これはサードパーティのDBです-スキーマを制御できません。)

個人と住所を関連付けるために、Code Firstで関係を設定するにはどうすればよいですか?流暢なAPIを使用していますが、両方のエンティティにキーがないと設定する方法がわかりません。理想的には、エンティティを次のように設定する必要があります。

Person { 
 public int PersonID {get;set;}
 public string Name {get;set;}
 //other person properites

 //navigation property
 public Address Address {get;set;}
}

Address {
 public string Address1 {get;set;}
 //other properties for address

 //navigation property
 public Person Person {get;set;}
}

関係を構成するいくつかの方法を試しましたが、エラーが発生し続けます。Addressクラスを複合型として定義しようとしましたが、それは別のテーブルなので、それは機能しますか?また、HasOptionalとWithOptionalDependantを使用してみましたが、役に立ちませんでした。

したがって、アドレスがPerson内のエンティティになるようにEFCFロジックを最適に構成する方法についての考え。

どんな提案や助けも大歓迎です。

更新 以下のMarkの提案を試しましたが、別のエラーが発生します。(私のコメントを参照してください)

My Addressエンティティの設定では、PersonIDをエンティティキーとして設定します。

modelBuilder.Entity<Address>()
 .HasKey(a => a.PersonID);

modelBuilder.Entity<Address>()
 .Property(a => a.PersonID)
 .HasColumnName(<my real column name>);

したがって、DB内のエンティティのキ​​ーはPersonIDですが、PersonへのFKでもあります。これが問題の原因ですか?(繰り返しますが、私のDBではありません-サードパーティです。)どんな助けでも大歓迎です。ありがとう!!

4

2 に答える 2

1

本当に 1 対 1 の関係を望んでいますか?

関係は、多くのアドレスを持つ 1 人の人物である可能性がありますが、常に 1:1 です。(これはサード パーティの DB です。スキーマを制御することはできません。)

これは、実際には 1 対多の関係が正しいことを意味しますか?

そうは言っても、ナビゲーション コレクションは Address(es) を Person オブジェクトにマップする理想的な方法だと思います。

Person { 
 public int PersonID {get;set;}
 public string Name {get;set;}
 //other person properites

 //navigation property
 public virtual ICollection<Address> Addresses {get;set;}
}

そして、対応するFluentは次のとおりです(これは、PersonIDがアドレスにマップされていることを前提としています。これは、DBを記述するときに行いますが、コードでは行いません)

modelBuilder.Entity<Person>()
            .HasMany(p => p.Addresses)
            .WithRequired(a => a.Person)
            .HasForeignKey(a => a.PersonID);
于 2012-08-03T02:03:52.160 に答える
0

マークからの提案から外れていることがわかりました。

modelBuilder.Entity<Person>()
  .HasOptional<Address>(p => p.Address)
  .WithRequired(a => a.Person);

Person には Address がない可能性があるため (可能性は低いですが、可能だと思います)、optional:required マッピングを設定する必要がありますが、Address の PK は PersonID であるため、Address には Person があります。

注意すべき重要な点は、結果をシリアル化するときの Person と Address の間の循環参照です (結果を JSON にシリアル化するときにコントローラーでこれをキャッチしました)。個人アドレス情報を取得している特定のクエリのコンテキストでプロキシの作成を無効にすることで、これを回避しました。

_context.Configuration.ProxyCreationEnabled = false;

それができたら、Lazy Loading を使用して、必要なときに Person から Address 情報を取得します。すべてうまくいきます。助けてくれてありがとう!

于 2012-08-03T12:14:24.130 に答える