代码第一个约定不在实体框架6.2中的多对多关系上创建连接表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码第一个约定不在实体框架6.2中的多对多关系上创建连接表相关的知识,希望对你有一定的参考价值。
我有一些名为YogaProfile,YogaSpace和YogaSpaceEvent的实体,它们都是。一对多(例如,YogaProfile-> YogaSpace-> YogaSpaceEvent)把它想象成一个学生到教室,一个课堂活动。
仅供参考 - 我使用的是EF6.2,而不是7
我想在YogaProfile和YogaSpaceEvent之间创建一个多对多的关系。恩。学生可以注册许多课堂活动,课堂活动可以有很多学生。我正在关注这些链接here和here以获取代码首次多对多实现
但是当我运行add-migration时,迁移文件不包含任何连接表(例如YogaProfileYogaSpaceEvent),当我更新数据库时,仍然没有连接表。
这是我的迁移文件的样子
public override void Up()
{
AddColumn("dbo.YogaSpaceEvents", "YogaProfile_YogaProfileId", c => c.Int());
AddColumn("dbo.YogaProfiles", "YogaSpaceEvent_YogaSpaceEventId", c => c.Int());
CreateIndex("dbo.YogaSpaceEvents", "YogaProfile_YogaProfileId");
CreateIndex("dbo.YogaProfiles", "YogaSpaceEvent_YogaSpaceEventId");
AddForeignKey("dbo.YogaSpaceEvents", "YogaProfile_YogaProfileId", "dbo.YogaProfiles", "YogaProfileId");
AddForeignKey("dbo.YogaProfiles", "YogaSpaceEvent_YogaSpaceEventId", "dbo.YogaSpaceEvents", "YogaSpaceEventId");
}
这就是我在实体YogaProfile和YogaSpaceEvent上所做的事情
public class YogaProfile {
public YogaProfile() {
YogaSpaceEvents = new List<YogaSpaceEvent>();
}
public virtual ICollection<YogaSpaceEvent> YogaSpaceEvents { get; set; }
}
public class YogaSpaceEvents {
public YogaSpaceEvents() {
RegsiteredStudents = new List<YogaProfile>();
}
public virtual ICollection<YogaProfile> RegisteredStudents { get; set; }
}
答案
尝试HashSet而不是List:
public class YogaProfile {
public YogaProfile() {
YogaSpaceEvents = new HashSet<YogaSpaceEvent>();
}
public virtual int YogaProfileId{ get; set; }
public virtual ICollection<YogaSpaceEvent> YogaSpaceEvents { get; set; }
}
public class YogaSpaceEvents {
public YogaSpaceEvents() {
RegisteredStudents = new HashSet<YogaProfile>();
}
public virtual int YogaSpaceEventId { get; set; }
public virtual ICollection<YogaProfile> RegisteredStudents { get; set; }
}
而且我建议使用FluentApi显式映射实体。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<YogaProfile>()
.HasMany<Course>(s => s.YogaSpaceEvents)
.WithMany(c => c.RegisteredStudents )
.Map(cs =>
{
cs.MapLeftKey("YogaProfileId");
cs.MapRightKey("YogaSpaceEventId");
cs.ToTable("YogaSpaceEventsRegisteredStudents");
});
}
以上是关于代码第一个约定不在实体框架6.2中的多对多关系上创建连接表的主要内容,如果未能解决你的问题,请参考以下文章