在代码第一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 (); } }