Сначала создаем строгие отношения 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, но в базе данных это будет одна таблица.