2015-04-08 3 views
0

У меня есть упражнения таблицу, каждое упражнение может быть 1 из 5 Упражнение Тип (например. Кардио, приуроченная активности, веса, сочетание веса и засек, что-то еще). Каждый из разных типов хранит данные по-другому (например, cardio - интенсивность и время, timed - это просто время в минутах, вес - это набор x повторений x weight, а что-то еще может быть что-то еще).Как смоделировать эти отношения эффективно

Итак, это задание, что у меня есть таблица упражнений, но не уверен, как моделировать тип упражнения и хранить связанные данные упражнения для каждого типа упражнений. Каждое упражнение будет иметь только один тип упражнений, и каждый тип упражнений может принадлежать многим упражнениям.

Я наклонялся только к таблице упражнений и таблице типа упражнений и имел отношение много к одному, но я не могу понять, как лучше хранить данные упражнений.

Это будет смоделировано для Entity Framework 6 и MS SQL Server.

+0

Похоже, что ваш вопрос действительно о том, как моделировать тип упражнений. У вас уже есть решение 1: N. –

ответ

1

Я думаю, что ваш сценарий хорош для наследования (используя таблицу на иерархию), вот мое Рекомендованное дизайн:

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); 
} 

В качестве примера , добавьте временное упражнение и прикрепите его к упражнению с идентификатором № 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(); 

Имеет ли это смысл?

+0

Чтобы уточнить, расширив Cardio: BaseType ... вы хотели расширить Cardio: ExerciseBaseType? – Reza

+0

@ Реза да! извините за опечатку, исправлено! – renakre

+0

Нужно еще уточнить, потому что я застрял, пытаясь смоделировать его так, как у вас есть. Каждое упражнение будет иметь один из четырех типов упражнений, однако данные, связанные с типом упражнений, относятся к каждому упражнению. Если у меня есть 10 упражнений, каждое упражнение может состоять из 5 типов, но соответствующая мера (время, вес и т. Д.) Будет для каждого упражнения. Таким образом, я не думаю, что модель выше работает – Reza

Смежные вопросы