このようなソリューションを実装することの難しさと可能性については、以下の例で説明します。
マッピング一対一
マッピング一対一は(両側が必要とされる場合)にも難しいものです。
これを外部キーでどのように表現できるか想像してみましょう。再びCarId
のPeople
にはCarId
のCar
、PersonId
のPersonId
のPeople
を参照してください。
ここで、車のレコードを挿入するとどうなりますか?これが成功するためには、このカーレコードにはPersonId
が指定されている必要があります。このPersonId
を有効にするには、People
に対応するレコードが存在する必要があります。それでは、人物のレコードを挿入してみましょう。しかし、これが成功するには、有効なCarId
が人物レコード—に入っていなければなりませんが、その車はまだ挿入されていません!参照された人物のレコードを最初に挿入する必要があるため、できません。しかし、参照された人物レコードは、車のレコードを参照するため挿入することはできません。最初に挿入する必要があります(外部キー - ception :))。
これは「論理的な」方法でも表現できません。ここでも、外部キーのいずれかを削除する必要があります。あなたが落とすのはあなた次第です。外部キーが残されている側を「従属」と呼び、外部キーなしで残っている側を「プリンシパル」と呼びます。また、依存関係の一意性を保証するために、PKはFKでなければなりません。したがって、FK列を追加してモデルにインポートすることはサポートされていません。
ので、ここでの設定です:今では
public class CarEntityTypeConfiguration : EntityTypeConfiguration<Car>
{
public CarEntityTypeConfiguration()
{
this.HasRequired(c => c.Person).WithRequiredDependent(p => p.Car);
this.HasKey(c => c.PersonId);
}
}
あなたが本当にそれのロジックを得ている必要があります:)ただ、ちょうど依存/校長を使用するように注意してください、あなたは同様に他の側を選択することができることを覚えておいてくださいバージョンのWithRequired(あなたはまだカーでPKを設定する必要があります)。あなたがDBスキーマをチェックすると
public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
public PersonEntityTypeConfiguration()
{
this.HasRequired(p => p.Car).WithRequiredPrincipal(c => c.Person);
}
}
、あなたはそれが1対1またはゼロ溶液の場合にあったように、それはまったく同じだということを見つけることができます。もう一度、これはスキーマによって強制されるのではなく、EF自体によって実行されるからです。
class Foo
{
List<Bar> Bars { get; set; }
[Required]
public int PrimaryBarId { get; set; }
public Bar PrimaryBar { get; set; }
}
class Bar
{
public Foo Foo { get; set; }
}
しかし、データベースが
aFoo.PrimaryBar.FooId == aFooを強制しないことに注意してください:だからもう一度、気をつけて:)あなたが得ることができるように