Операция не выполнена, так как в таблице «TestAs» уже существует индекс или статистика с именем «IX_ID»? - PullRequest
0 голосов
/ 12 марта 2012

Сначала я использую код EF4.3.1, у меня есть код, приведенный ниже,

 namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new myContext())
            {
                TestA ta = new TestA();
                ta.Name = "Hero";
                TestB tb = new TestB();
                tb.Name = "Allen";
                TestC tc = new TestC();
                tc.Name = "Iverson";
                ta.tb = tb;
                ta.tc = tc;
                context.testASet.Add(ta);
            }
        }
    }

    class TestA
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public TestB tb { get; set; }

        public TestC tc { get; set; }
    }

    class TestB
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public TestA ta { get; set; }
    }

    class TestC
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public TestA ta { get; set; }
    }

    class myContext : DbContext
    {
        public DbSet<TestA> testASet { get; set; }
        public DbSet<TestB> testBSet { get; set; }
        public DbSet<TestC> testCSet { get; set; }

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

            modelBuilder.Entity<TestA>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<TestB>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<TestC>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);


        }
    }
}

Когда я отлаживаю проект, возникает исключение: «Операция не выполнена, так как индекс или статистика симя «IX_ID» уже существует в таблице «TestAs». "Но если я удалю «TestC» из кода, только «TestA» и «TestB», измените код, как показано ниже:

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new myContext())
            {
                TestA ta = new TestA();
                ta.Name = "Hero";
                TestB tb = new TestB();
                tb.Name = "Allen";               
                ta.tb = tb;
                context.testASet.Add(ta);
            }
        }
    }

    class TestA
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public TestB tb { get; set; }

    }

    class TestB
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public TestA ta { get; set; }
    }


    class myContext : DbContext
    {
        public DbSet<TestA> testASet { get; set; }
        public DbSet<TestB> testBSet { get; set; }

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

            modelBuilder.Entity<TestA>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<TestB>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        }
    }
} 

все работает хорошо.Кто-нибудь знает, почему было брошено исключение?

1 Ответ

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

Вы используете отображение общего первичного ключа с одним зависимым объектом и двумя основными объектами. В соответствии с вашим маппингом первичный ключ от TestA представляет собой FK до TestB, а также TestC. Вот почему EF жалуется, когда пытается создать 2 FK с одинаковым именем.

ИМО, это не практическая ситуация. Объясните, какие отношения существуют между сущностями, чтобы можно было более реалистично смоделировать ситуацию.

...