сначала создайте строгие отношения 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?

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


person James    schedule 05.06.2012    source источник
comment
Есть ли причина, по которой вы хотите, чтобы Person и PersonDetail были разделены, а не просто помещались в один и тот же объект? Если одно не может жить без другого, не кажется, что есть преимущество моделировать их отдельно. Я сделал то, что вы хотите раньше (не в EF, а с использованием ограничений в БД), и это действительно просто создает головную боль. Каждый раз, когда я пытаюсь вставить любую запись, возникает ошибка, потому что ее партнер не существует. Невозможно вставить две записи одновременно. Таким образом, вам придется удалить ограничения, вставить обе записи, а затем снова включить ограничения.   -  person AaronLS    schedule 20.06.2012


Ответы (1)


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

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

person Ladislav Mrnka    schedule 05.06.2012
comment
Спасибо за ваш ответ, не могли бы вы рассказать мне, как модель впервые достигает этой цели? - person James; 05.06.2012
comment
Привет, @Ladislav Mrnka, есть идеи? - person James; 06.06.2012
comment
Модель сначала не создаст для вас разбиение таблицы. Потребуется изменить процесс генерации, чтобы идентифицировать отношение один к одному и создать единую таблицу для связанных сущностей. Это было бы довольно сложным изменением. - person Ladislav Mrnka; 06.06.2012