如何有效地模拟这种关系

时间:2015-04-08 23:56:46

标签: sql sql-server database entity-framework

我有一个练习表,每个练习可以是5个练习类型中的一个(例如,有氧运动,定时活动,体重,重量和时间的组合,等等)。每种不同的类型以不同的方式存储数据(例如,有氧运动是强度和时间,定时是以分钟为单位的时间,权重是设置x代表x重量,其他东西可能是其他东西)。

所以我给出了一个练习表,但不确定如何建模练习类型并存储每个练习类型的相关练习数据。每个练习只有一个练习类型,每个练习类型可以属于许多练习。

我只是倾向于练习表和练习类型表,并且有多对一的关系,但我无法弄清楚如何最好地存储每个练习数据。

这将针对Entity Framework 6和MS SQL Server进行建模。

1 个答案:

答案 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();

这有意义吗?