2012-03-05 8 views
0

は私が一から一... 0の関係を作成するためにEF4.3を使用しなかったが、それは EF4.3一対一のかゼロの関係を作成するには

の例外を投げる「操作が失敗したため、インデックスまたは名前の統計は 'IX_id' はすでに

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

誰でも助けることができる以下のように '種皮'」

コードテーブルの上に存在していますか?

+0

ここではどのエンティティが原則ですか? – Eranga

+0

こんにちは、Eranga、TestB、TestCは主体です – James

+0

それで 'TestA'は共有主キーではマッピングできません。モデルが有効ではありません(実用的) – Eranga

答えて

0

WithOptionalPrincipalしてOnModelCreating方法でWithRequiredを置き換えます

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

を(あなたがWithOptionalDependentを使用したい主なエンティティになります。)

EDIT

をあなたのコメントI後2つのクラスTestDとTestEを追加し、Aに2つのナビゲーションプロパティ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(NULL値可能)、DとE(NULL値なし)の4つの外部キーがあります。私は後者があなたが望むものだと思います。

+0

こんにちはGertArnold、コードは私の関係を変更するようです。私のコードでTestAとTestBだけを持っていれば、すべて正常に動作しますが、TestCをコードに追加すると、 "TestAのテーブルにすでにインデックスがあります"という例外がスローされました。何か案が? – James

+0

TestCをコードに追加するとどういう意味ですか? –

+0

コード内にTestCクラスがなく、TestAとTestBだけの場合は、 "modelBuilder.Entity ().HasOptional(x => x.NavA).WithOptionalPrinciple();"のコードをコメントしてくださいコードが最初の投稿のようなものなら、それは動作しません – James

関連する問題