Ссылки Code First и Parent-Child

Я использую Code First CTP 5. У меня довольно простая настройка между родительской и дочерней таблицами.

Create table testA (
    id int not null identity(1,1),
    stuff varchar(200),
    primary key (id)
    );
go

create table testB (
    id int not null
        foreign key references testA(id),
    morestuff varchar(200),
    primary key (id)
    );
go

Чтобы обратиться к этой таблице с помощью Code First, у нас есть следующая конструкция:

namespace Test.Models
{
    public class TestEntities : DbContext
    {
        public DbSet<testa> testa { get; set; }
        public DbSet<testb> testb { get; set; }

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<testa>().ToTable("testa");
            modelBuilder.Entity<testa>()
                .Property(p => p.id)
                .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);

            modelBuilder.Entity<testb>().ToTable("testb");
        }
    }


    public class testa
    {
        public int id { get; set; }
        public String stuff { get; set; }

        public virtual testb testb { get; set; }
    }

    public class testb
    {
        public int id { get; set; }
        public string morestuff { get; set; }

        public virtual testa testa { get; set; }
    }
}

Когда я пытаюсь добавить запись в testa, я получаю сообщение об ошибке «Невозможно вставить явное значение для столбца идентификаторов в таблице« testA », когда для параметра IDENTITY_INSERT установлено значение OFF».

В порядке. Страйк 1 в Code First за то, что он не распознал, что Id является столбцом идентификаторов. Мы можем это исправить, поэтому сообщаем CodeFirst, что testa.id — это идентификатор:

    modelBuilder.Entity<testa>()
        .Property(p => p.id)
        .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);

После этого мы запускаем его снова и получаем еще одну ошибку: «Зависимое свойство в ReferentialConstraint сопоставлено со столбцом, сгенерированным хранилищем. Столбец: 'id'». Итак - что не так с этой картинкой?

Что я делаю не так и как это исправить???


person Steve G    schedule 16.02.2011    source источник


Ответы (1)


В ассоциации 1:1 Code First распознает один из объектов как основной, а другой — как зависимый. Затем он делает основной PK идентификатором, и вам нужно позаботиться о действительном уникальном PK при вставке в зависимую таблицу. В вашем случае он выбирает testb в качестве принципала, но похоже, что вы хотите, чтобы testa был основным концом в этой ассоциации. Этого можно добиться, используя свободный API и в основном давая Code First подсказку о том, какой из них является основным, а какой зависимым:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<testb>()
                .HasRequired(b => b.testa)
                .WithOptional(a => a.testb);                
}

Дополнительные сведения см. в этой статье:
Ассоциации в EF Code First CTP5: часть 2 — общие ассоциации первичного ключа

person Morteza Manavi    schedule 17.02.2011