EF4.3 создать отношение один к одному или ноль не удалось - PullRequest
0 голосов
/ 05 марта 2012

Я использую EF4.3 для создания отношения от 1 до 1 ... 0, но выдает исключение

"Операция не выполнена, так как индекс или статистика с именем 'IX_id' уже существуетна столе "TestAs" "

Код, указанный ниже

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (myContext context = new myContext())
            {
                TestA tA = new TestA();
                TestB tB = new TestB();
                TestC tC = new TestC();
                context.testA.Add(tA);
                context.testB.Add(tB);
                context.testC.Add(tC);
                context.SaveChanges();
            }
        }
    }

    class TestA
    {
        public int id { get; set; }
        //public TestB NavB { get; set; }
        //public TestC NavC { get; set; }
    }

    class TestB
    {
        public int id { get; set; }
        public TestA NavA { get; set; }
    }

    class TestC
    {
        public int id { get; set; }
        public TestA NavA { get; set; }
    }

    class myContext : DbContext
    {
        public DbSet<TestA> testA { get; set; }
        public DbSet<TestB> testB { get; set; }
        public DbSet<TestC> testC { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TestB>().HasOptional(x => x.NavA).WithRequired();
            modelBuilder.Entity<TestC>().HasOptional(x => x.NavA).WithRequired();
        }
    }
}

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

1 Ответ

0 голосов
/ 05 марта 2012

Замените WithRequired в вашем OnModelCreating методе на WithOptionalPrincipal:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<TestB>().HasOptional(x => x.NavA).WithOptionalPrincipal();
  modelBuilder.Entity<TestC>().HasOptional(x => x.NavA).WithOptionalPrincipal();
}

(Если бы А была главной сущностью, вы бы использовали WithOptionalDependent.)

EDIT

После ваших комментариев, я думаю, было бы интересно увидеть эффект от добавления двух классов TestD и TestE, присвоения A двух свойств навигации TestD и TestE и сделать это в вашей модели:

modelBuilder.Entity<TestB>().HasOptional(x => x.NavA).WithOptionalPrincipal();
modelBuilder.Entity<TestC>().HasOptional(x => x.NavA).WithOptionalPrincipal();
modelBuilder.Entity<TestA>().HasRequired(x => x.NavD);
modelBuilder.Entity<TestA>().HasRequired(x => x.NavE);

В таблице A теперь есть четыре внешних ключа: B и C (обнуляемые), D и E (не обнуляемые). Я думаю, что последнее, что вы хотите.

...