2011-09-16 20 views
1

ここではいくつかの質問を見てきましたが、これに関するすべての(精神的な)点を結んでいません。私はいくつかの助けに感謝します。Entity Frameworkコード1 - 多対多の追加情報のマッピング

マイモデル(コード最初の):私のContextクラスで次に

public class cgArmorial 
{ 
    [Key] 
    [Display(Name = "Armorial ID")] 
    public Guid ArmorialID { get; set; } 
    [Display(Name = "User ID")] 
    public Guid UserId { get; set; } 
    public string Name { get; set; } 
    public string DeviceUrl { get; set; } 
    public string Blazon { get; set; } 

    public virtual ICollection<cgArmorialAward> ArmorialAwards { get; set; } 
} 

public class cgArmorialAward 
{ 
    public cgArmorial Armorial { get; set; } 
    public cgAward Award { get; set; } 
    public DateTime AwardedOn { get; set; } 
} 
public class cgAward 
{ 
    [Key] 
    [Display(Name = "Award ID")] 
    public Guid AwardID { get; set; } 
    public string Name { get; set; } 
    public string Group { get; set; } 
    public string Description { get; set; } 
    public string ImageUrl { get; set; } 
    public string Blazon { get; set; } 

    public virtual ICollection<cgArmorialAward> ArmorialAwards { get; set; } 
} 

私が持っている(最後の2個のエントリ):

public class Context : DbContext 
{ 
    public DbSet<cgUser> Users { get; set; } 
    public DbSet<cgEvent> Events { get; set; } 
    public DbSet<cgEventType> EventTypes { get; set; } 
    public DbSet<cgArmorial> Armorials { get; set; } 
    public DbSet<cgAward> Awards { get; set; } 
    public DbSet<cgArmorialAward> ArmorialAwards { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<cgUser>() 
        .HasMany<cgEvent>(e => e.EventAutocrats) 
        .WithMany(u => u.EventAutocrats) 
        .Map(m => 
        { 
         m.ToTable("EventAutocrats"); 
         m.MapLeftKey("UserId"); 
         m.MapRightKey("EventId"); 
        }); 
     modelBuilder.Entity<cgUser>() 
        .HasMany<cgEvent>(e => e.EventStaff) 
        .WithMany(u => u.EventStaff) 
        .Map(m => 
        { 
         m.ToTable("EventStaff"); 
         m.MapLeftKey("UserId"); 
         m.MapRightKey("EventId"); 
        }); 
     modelBuilder.Entity<cgArmorialAward>() 
        .HasRequired(a => a.Armorial) 
        .WithMany(b => b.ArmorialAwards); 
     modelBuilder.Entity<cgArmorialAward>() 
        .HasRequired(a => a.Award) 
        .WithMany(); // b => b.ArmorialAwards 
    } 
} 

私が実行しようとすると、私はこのエラーを取得しています:

System.Data.Edm.EdmEntityType :: EntityType 'cgArmorialAward'には、 キーが定義されていません。このEntityTypeのキーを定義します。 System.Data.Edm.EdmEntitySet:EntityType:EntitySet ArmorialAwards は、キーが定義されていないタイプ cgArmorialAwardbasedに基づいています。

答えて

4

例外として、あなたのエンティティで定義されているキーがありませんcgArmorialAward。すべてのエンティティにキーが必要です。次のように変更します。

public class cgArmorialAward 
{ 
    [Key, Column(Order = 0)] 
    [ForeignKey("Armorial")] 
    public Guid ArmorialID { get; set; } 

    [Key, Column(Order = 1)] 
    [ForeignKey("Award")] 
    public Guid AwardID { get; set; } 

    public cgArmorial Armorial { get; set; } 
    public cgAward Award { get; set; } 
    public DateTime AwardedOn { get; set; } 
} 

複合キー内のフィールドので、ForeignKey属性、同時に他の二つのテーブルへの外部キーです。 (クラスには "cgXXX"、外部キーのプロパティには "XXXId")を持っているため、規約が自動的にこれを検出するかどうかは分かりません。一方、プロパティ名ArmorialAwardは、私はEF規約でこれを考慮するかどうか分からないので、おそらくForeignKey属性は必要ではありませんが、少なくともそれは間違っていません)。

関連する問題