【问题标题】:The operation failed because an index or statistics with name 'IX_ID' already exists on table 'TestAs'?操作失败,因为表 'TestAs' 上已存在名称为 'IX_ID' 的索引或统计信息?
【发布时间】:2012-03-12 07:08:11
【问题描述】:

我先用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);


        }
    }
}

当我调试项目时,抛出异常,“操作失败,因为表 'TestAs' 上已经存在名称为 'IX_ID' 的索引或统计信息。” 但是,如果我从代码中删除“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);

        }
    }
} 

一切正常。有人知道为什么会抛出异常吗?

【问题讨论】:

  • 我以为我们有tackled this?再次,您有两次HasOptional(...).WithRequired()

标签: entity-framework ef-code-first code-first one-to-one


【解决方案1】:

您正在使用具有一个依赖实体和 2 个主要实体的共享主键映射。根据您的映射主键TestATestBTestC 的FK。这就是为什么 EF 在尝试创建 2 个具有相同名称的 FK 时会报错的原因。

IMO 这不是实际情况。解释实体之间的关系,以便更真实地模拟情况。

【讨论】:

  • 嗨,我不清楚 EF 如何创建索引。为什么TestA是两个实体的FK会导致同一个索引创建两次?
  • @HeroIverson3 EF 要么假设为给定的列只创建一个 FK,要么可能是一个错误。无论如何,我没有看到您创建的实际情况。
  • 停止假设建模是错误的。这不是问题所在。可以在这里找到解决方案:stackoverflow.com/questions/10441924/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多