我有一个练习表,每个练习可以是5个练习类型中的一个(例如,有氧运动,定时活动,体重,重量和时间的组合,等等)。每种不同的类型以不同的方式存储数据(例如,有氧运动是强度和时间,定时是以分钟为单位的时间,权重是设置x代表x重量,其他东西可能是其他东西)。
所以我给出了一个练习表,但不确定如何建模练习类型并存储每个练习类型的相关练习数据。每个练习只有一个练习类型,每个练习类型可以属于许多练习。
我只是倾向于练习表和练习类型表,并且有多对一的关系,但我无法弄清楚如何最好地存储每个练习数据。
这将针对Entity Framework 6和MS SQL Server进行建模。
答案 0 :(得分:1)
我认为你的场景适合继承(使用Table-per-Hierarchy),这是我建议的设计:
public Exercise
{
public int ExerciseId {get;set;}
[ForeignKey("ExerciseBaseTypeId")]
public ExerciseBaseType ExerciseType {get;set;}
[Required]
public int ExerciseBaseTypeId {get;set;}
}
public ExerciseBaseType
{
public int BaseTypeId{get;set;}
public Link<Exercise> Exercises {get;set;}
//put other base properties that is common to all exercise types
}
public Cardio : ExerciseBaseType {
public string Intensity {get;set;}
public int Time {get;set;}
}
public Timed : ExerciseBaseType {
public int Duration {get;set;}
}
public Weight : ExerciseBaseType {
public int Sets {get;set;}
public int Weight {get;set;}
}
这是你的dbcontext文件:
public class ExerciseDbContext : DbContext
{
public ExerciseDbContext()
: base("ExerciseDatabase"){ }
}
public DbSet<Exercise> Exercises { get; set; }
public DbSet<ExerciseBaseType> ExerciseTypes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Exercise>()
.HasRequired(e => e.ExerciseBaseType)
.WithMany(ebt => ebt.Exercises)
.HasForeignKey(e.ExerciseBaseTypeId);
}
举个例子,让我们添加一个定时练习并将其附加到ID为#1的练习
ExerciseDbContext db = new ExerciseDbContext();
var timedExercise = new Timed();
timedExercise.Duration = 60;
//set the other base properties
db.Exercises
.Single(e => e.ExerciseId = 1)
.ExerciseTypes.Add(timedExercise);
db.SaveChanges();
这有意义吗?