我一直在重新审视我使用实体的方式,我需要建议。
我正在创建一个瑜伽预订服务,每个用户都会有一个个人资料、瑜伽和活动的聚会空间,以及每个聚会空间的日期和时间。
所以我的关系看起来像这样,它们都是一对多的
YogaProfile -> YogaSpace(s) -> YogaSpaceEvent(s)
创建活动后,成员 ( YogaProfiles
) 可以加入任何人的活动。有点像上课。这是一个注册/调度系统。
最初,我创建了一个名为RegisterdStudents
并将集合添加到YogaSpaceEvent
. 像这样
public class YogaSpaceEvent
{
// other code here left out
public virtual ICollection<RegisteredStudent> RegisteredStudents { get; set; }
}
RegisteredStudent
看起来像这样
public class RegisteredStudent
{
[Key]
public int RegisteredStudentId { get; set; }
[Index]
public int YogaSpaceEventId { get; set; }
[ForeignKey("YogaSpaceEventId")]
public virtual YogaSpaceEvent YogaSpaceEvent { get; set; }
[Index]
public int StudentId { get; set; }
}
这一切都很好,但后来我了解了更多关于多对多的知识,并认为我可能需要在这里使用它,因为许多配置文件可以注册一个事件,并且许多事件可以注册到一个配置文件 ex。一个班级可以有很多人参加,一个学生可以参加很多次课程。
virtual ICollection
因此,我更改了代码以通过在两个实体(YogaProfile
, )中的每一个上创建一个并创建一个像这样YogaSpaceEvent
调用的连接表来建立多对多关系RegisteredStudentInEvent
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<YogaProfile>()
.HasMany<YogaSpaceEvent>(x => x.YogaSpaceEvents)
.WithMany(x => x.RegisteredStudents)
.Map(x =>
{
x.MapLeftKey("YogaProfileId");
x.MapRightKey("YogaSpaceEventId");
x.ToTable("RegisteredStudentInEvent");
});
}
现在我可以成功地将多个学生 ( YogaProfile
) 添加到一个班级 ( YogaSpaceEvent
) 中,并且在表格中我看到了带有事件 ( YogaSpaceEventId
) 的行和谁已注册 ( YogaProfileId
)。
但是现在,看看这个多对多关系设置,我发现我永远不需要像下面这样YogaSpaceEvent
向一个学生(YogaProfile
)添加多个类(),因为YogaSpaceEvents
它被添加到集合中YogaSpaces
,而不是YogaProfile
yogaProfile.YogaSpaceEvents.Add(yogaSpaceEvent)
所以我的问题是,我应该回到最初的方式还是继续使用这种多对多模型?有什么区别,优点,缺点等?