Сначала создаем строгие отношения 1 к 1 по коду

Сначала я хочу создать отношение 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?

Кто-нибудь может помочь?

1 ответ

Решение

Это возможно только если оба Person а также PersonDetail будет сопоставлен с той же таблицей (метод сопоставления называется разделением таблиц), поскольку строгое 1:1 означает, что вы не можете вставить Person без существующих PersonDetail но вы также не можете вставить PersonDetail без существующих Person => вы не можете вставить ни один из них, потому что зависимость всегда будет отсутствовать (помните, что каждая запись имеет свою собственную команду вставки, и база данных проверяет целостность после каждой команды, а не после транзакции).

Только при использовании разделения таблицы EF создаст одну команду вставки, содержащую данные из обеих сущностей. В вашей модели сущностей это будет выглядеть как две сущности с отображением 1:1, но в базе данных это будет одна таблица.

Другие вопросы по тегам