在代码第一entity framework中定义多对多关系

我在模型中有3个课程,如下所示。

[Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string UserName { get; set; } public ICollection MartialArtUserProfiles { get; set; } } [Table("MartialArt")] public class MartialArt { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public string IconPath { get; set; } public string ImagePath { get; set; } public ICollection MartialArtUserProfiles { get; set; } } public class MartialArtUserProfile { public int UserProfileId { get; set; } public UserProfile UserProfile { get; set; } public int MartialArtId { get; set; } public MartialArt MartialArt { get; set; } } 

我有一个用于多对多关系的配置类,如下所示:

 public class MartialArtUserProfileConfiguration : EntityTypeConfiguration { public MartialArtUserProfileConfiguration() { HasKey(a => new { a.MartialArtId, a.UserProfileId }); HasRequired(a => a.MartialArt) .WithMany(s => s.MartialArtUserProfiles) .HasForeignKey(a => a.MartialArtId) .WillCascadeOnDelete(false); HasRequired(a => a.UserProfile) .WithMany(p => p.MartialArtUserProfiles) .HasForeignKey(a => a.UserProfileId) .WillCascadeOnDelete(false); } } 

在我尝试在程序包管理器控制台中运行Update-Database时定义我的实体关系后,它说:

在模型生成期间检测到一个或多个validation错误:

\ tSystem.Data.Entity.Edm.EdmEntityType :: EntityType’MartialArtUserProfile’没有定义键。 定义此EntityType的键。 \ tSystem.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet’MartialArtUserProfiles’基于类型’MartialArtUserProfile’,没有定义键。

我究竟做错了什么?

提前致谢,

如果我理解你只是想用一个传递表来创建多对多。 如果是这样,这是另一种方法。 使用Fluent API进行如下映射。 您可以将UserProfileToMartialArt更改为您希望表名称的任何内容。 而不是创建MartialArtUserProfile模型让EF为您创建中间地带。 这也指定了可以解决错误的键。

 modelBuilder.Entity() .HasMany(b => b.MartialArts) .WithMany(a => a.UserProfiles) .Map(m => m.MapLeftKey("MartialArtId") .MapRightKey("UserProfileId") .ToTable("UserProfileToMartialArt")); 

在MartialArts Model中

 public IList UserProfiles { get; set; } 

在UserProfile Model中放

 public IList MartialArts { get; set; } 

尝试这样做:

 [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string UserName { get; set; } [InverseProperty("UserProfiles")] public IList MartialArts { get; set; } } [Table("MartialArt")] public class MartialArt { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public string IconPath { get; set; } public string ImagePath { get; set; } [InverseProperty("MartialArts")] public IList UserProfiles { get; set; } } 

在EntityFramework 6.1中,您不需要执行任何操作 – 只需将两种类型的集合添加到每个类中,一切就绪。

 public class UserProfile { public int Id { get; set; } public string UserName { get; set; } public virtual ICollection MartialArts { get; set; } public UserProfile() { MartialArts = new List(); } } public class MartialArt { public int Id { get; set; } public string Name { get; set; } // *snip* public virtual ICollection UserProfiles { get; set; } public MartialArt() { UserProfiles = new List(); } }