EF4.3创建一对一或零关系失败

时间:2012-03-05 09:17:52

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

我使用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 :(得分:0)

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();
}

(如果A将是您使用的主要实体WithOptionalDependent。)

修改

在您发表评论后,我认为看到添加两个类TestD和TestE的效果会很有趣,给出两个导航属性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(不可为空)。我认为后者就是你想要的。