9

が1つまたは1つのエンティティをスカフォールドしようとしたときのAspNet MVC 3プロジェクト他のエンティティとの関係「私は同じインデックスが既に追加されています "というエラーが表示されます。MVCスカッフォールディングとEFの1対0または1対1の関係エラー

これは、関連するテーブルの主キーも外部キーである場合に発生します。

現時点では私の問題を回避するには、関連テーブルにID列を追加し、それが

  • 主キーが外部キー列に一意のキーを追加します

    1. です。

    これに伴う問題は、EFはなく、関連するエンティティタイプのちょうどプロパティの関連するエンティティ(Iがゼロの場合にはnullに設定することができる関連エンティティ)

    ためいるICollectionナビゲーションプロパティを生成することです

    これは既知のバグですか?

    何か間違っていますか?

    ICollectionのナビゲーションプロパティを削除する方がよいでしょうか?

  • +0

    DbContextコード生成を使用していますか? –

    +0

    EF 4.3でDbContextを使用していて、同じ問題があります。私のアプリはコードファーストを使用してDBを生成します。 Mike

    +0

    関連するテーブルの外部キーもプライマリキーとして使用する必要があります.1(0,1)の関係を実装する唯一の方法です。 –

    答えて

    3

    は、この質問に私の答えを参照してください:正しい構成でのコード例です

    How do I code an optional one-to-one relationship in EF 4.1 code first with lazy loading and the same primary key on both tables?

    を。

    public class ZoneMedia 
    { 
        public int ZoneMediaID { get; set; } 
        public string MediaName { get; set; } 
        public int Width { get; set; } 
        public int Height { get; set; } 
    
        public virtual ZoneMediaText MediaText { get; set; } 
    } 
    
    public class ZoneMediaText 
    { 
        public int ZoneMediaID { get; set; } 
        public string Text { get; set; } 
        public int Color { get; set; } 
    
        public virtual ZoneMedia ZoneMedia { get; set; } 
    } 
    
    public class TestEFDbContext : DbContext 
    { 
        public DbSet<ZoneMedia> ZoneMedia { get; set; } 
        public DbSet<ZoneMediaText> ZoneMediaText { get; set; } 
    
        protected override void OnModelCreating (DbModelBuilder modelBuilder) 
        { 
         modelBuilder.Entity<ZoneMedia>() 
          .HasOptional(zm => zm.MediaText); 
         modelBuilder.Entity<ZoneMediaText>() 
          .HasKey(zmt => zmt.ZoneMediaID); 
         modelBuilder.Entity<ZoneMediaText>() 
          .HasRequired(zmt => zmt.ZoneMedia) 
          .WithRequiredDependent(zm => zm.MediaText); 
    
         base.OnModelCreating(modelBuilder); 
        } 
    } 
    class Program 
    { 
        static void Main (string[] args) 
        { 
         var dbcontext = new TestEFDbContext(); 
         var medias = dbcontext.ZoneMedia.ToList(); 
        } 
    } 
    

    またDataAnnotationsでこれを達成することができますが、私は一般的にPOCOsとしての私のエンティティモデルを維持することを好みます。

    +0

    ありがとう、申し訳ありませんがこれを見て時間があったが、それは良いように聞こえる。受け入れに遅れて申し訳ありません。 – NVM

    +0

    常に便利です;) – WDRust