0

最初にコードで1対1の関係を作成したいのですが、以下は私のコードです。

class Person
{
    public int id { get; set; }
    public string Name { get; set; }
    public virtual PersonDetail detail { get; set; }
}

class PersonDetail
{
    public int id { get; set; }
    public double Height { get; set; }
    public double Weight { get; set; }
    public virtual Person person { get; set; }
}

class EFTest : DbContext
{
    public DbSet<Person> personSet { get; set; }
    public DbSet<PersonDetail> detailSet { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().HasRequired(x => x.detail).WithRequiredPrincipal(x => x.person);
    }
}

しかし、私はまだ人の詳細なしで人を挿入することができます。最初にモデルで1対1の関係を作成しようとしていますが、これはうまく機能します。一方の端をもう一方の端なしで挿入すると、例外がスローされます。上記のコードで最初にコードを作成すると、1対0..1の関係が作成されるのはなぜですか?

誰でも助けることができますか?

4

1 に答える 1

2

これは、両方が同じテーブルにマップされる場合にのみ可能ですPersonPersonDetailマッピング手法はテーブル分割と呼ばれます)。厳密な1:1は、存在せずに挿入できないことを意味しますが、Person既存なしで挿入PersonDetailすることもできません=>どちらも挿入できません依存関係は常に失われるためです(各レコードには独自の挿入コマンドがあり、データベースはトランザクション後ではなく、各コマンドの後に整合性をチェックすることを忘れないでください)。PersonDetailPerson

テーブル分割を使用する場合にのみ、EFは両方のエンティティからのデータを含む単一の挿入コマンドを作成します。エンティティモデルでは、1:1マッピングの2つのエンティティのように見えますが、データベースでは単一のテーブルになります。

于 2012-06-05T08:35:11.290 に答える