2012-03-05 73 views
0

我使用EF4.3创建1至1间... 0的关系,但它扔EF4.3创建一对一或零关系失败

异常“操作失败,因为索引或与名称统计 '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(); 
     } 
    } 
} 

任何人都可以帮助吗?通过WithOptionalPrincipalOnModelCreating方法

+0

哪个实体是这里的原理? – Eranga 2012-03-05 09:26:33

+0

嗨Eranga,TestB和TestC是原理实体 – James 2012-03-05 09:32:13

+0

Then'TestA'不能与共享主键映射。该模型是无效的(实际) – Eranga 2012-03-05 12:14:16

回答

0

更换WithRequired

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(不能为空)。我认为后者是你想要的。

+0

嗨GertArnold,代码似乎修改我的关系。如果我的代码中只有TestA和TestB,一切运行良好,但是在将TestC添加到代码中后,表“TestA中已存在索引”异常被抛出。任何想法? – James 2012-03-07 08:11:22

+0

将TestC添加到code_中意味着什么? – 2012-03-07 08:29:15

+0

请看我最初的帖子,如果代码中没有TestC类,只有TestA和TestB,请评论“modelBuilder.Entity ().HasOptional(x => x.NavA).WithOptionalPrinciple();”,代码工作,但如果代码是像最初的帖子,它不能工作 – James 2012-03-07 08:37:08