2017-07-06 5 views
1

私はEFコードの最初のデータベースをmigrationsフォルダの設定ファイルにシードしようとしていますが、どういうわけか、関連するデータベースへの新しいエントリ。EF 6.1.3多対多関係をシードする方法

私は以下のデータベース構造を持っています。

public class ClassSchedule 
    { 
     public int Id { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; } 

     public virtual Class Classes { get; set; } 
     public virtual Classroom Classrooms { get; set; } 
    } 

public class Class 
    { 
     public Class() 
     { 
      this.Students = new HashSet<Student>(); 
      this.ClassSchedules = new HashSet<ClassSchedule>(); 
     } 

     public int Id { get; set; } 
     public int LevelId { get; set; } 

     [StringLength(50)] 
     public string ClassName { get; set; } 
     public int MaxStudents { get; set; } 

     public virtual Level Levels { get; set; } 
     public ICollection<Student> Students { get; set; } 
     public ICollection<ClassSchedule> ClassSchedules { get; set; } 
    } 

    public class Classroom 
    { 
     public Classroom() 
     { 
      this.ClassSchedules = new HashSet<ClassSchedule>(); 
     } 

     public int Id { get; set; } 
     public string ClassRoomName { get; set; } 
     public int MaxStudents { get; set; } 

     public ICollection<ClassSchedule> ClassSchedules { get; set; } 
    } 

そして、私の移行構成ファイルに次のコードを持っている:

// all classrooms 
    context.Classrooms.Add(new Classroom() { ClassRoomName = "Cherry", MaxStudents = 20 }); 
    context.Classrooms.Add(new Classroom() { ClassRoomName = "Pear", MaxStudents = 12 }); 
    context.Classrooms.Add(new Classroom() { ClassRoomName = "Apple", MaxStudents = 12 }); 


    // classes 
    context.Classes.Add(new Class() { ClassName = "YR1", MaxStudents = 12, LevelId = 1 }); 
    context.Classes.Add(new Class() { ClassName = "YB1", MaxStudents = 6, LevelId = 3 }); 
    context.Classes.Add(new Class() { ClassName = "IELTS L1", MaxStudents = 40, LevelId = 14 }); 

今私が何をしたいのか、このようなものです:

// ClassRoom schedules, links the class and classroom on a certain time 
      context.ClassSchedules.Add(new ClassSchedule() { StartTime = DateTime.Parse("2017-09-17T18:00:00"), EndTime = DateTime.Parse("2017-09-17T20:00:00"), Classes = 1, Classrooms = 1 }); 

私が試したもう一つでした。

context.ClassSchedules.Add(new ClassSchedule() { StartTime = DateTime.Parse("2017-09-17T18:00:00"), EndTime = DateTime.Parse("2017-09-17T20:00:00"), Classes = { Id = 1 }, Classrooms = { Id = 2 } }); 

これはうまく動作しません。また、new Classes() { Id = 1 }を使用することができないことに注意してください。これにより、新しいエンティティが作成されます。

何か助けていただければ幸いです!

答えて

1

あなたはClassScheduleにコレクションに教室やクラスを追加することができます:それの要点です

var classRoom1 = new Classroom { ClassRoomName = "Cherry", MaxStudents = 20 }; 
var class1 = new Class { ClassName = "YR1", MaxStudents = 12, LevelId = 1 }; 
var classSchedule1 = new ClassSchedule { StartTime = ... }; 

classSchedule1.Classrooms.Add(classRoom1); 
classSchedule1.Classess.Add(class1); 

context.ClassSchedules.Add(classSchedule1); 

など

を。スケジュールに属するクラスと教室をClassScheduleのコレクションに追加し、スケジュールをコンテキストに追加します。スケジュールに属していないクラスと教室をコンテキストのDbSetに追加します。

+0

まずはお手伝いをしていただきありがとうございます。私は解決策を試してみましたが、「classSchedule1.Classrooms.Add()」メソッドはICollection タイプでは使用できないといっても不思議はありません。私はここでICollectionを使用して間違いを犯しましたか? –

+0

私はプロパティ名に惑わされました。 'Classes'は複数形ですが、タイプには注意を払っていません。それは単なるクラスです。 –

0

@gertArnoldが提案した方法で動作させることができませんでしたが、しばらく見回した後、AddOrUpdateメソッドを使用して可能であることがわかりました。ない。次のようにその場合には、それが書き込まれます。

context.ClassSchedules.AddOrUpdate(cs => cs.ScheduleName, 
     new ClassSchedule 
     { 
      ScheduleName = "Yippie red class", 
      StartTime = DateTime.Parse("2017-09-17T18:00:00"), 
      EndTime = DateTime.Parse("2017-09-17T20:00:00"), 
      Classes = new Class() 
      { 
       ClassName = "YR1", 
       MaxStudents = 12, 
       LevelId = 1 
      }, 
      Classrooms = new Classroom() 
      { 
       ClassRoomName = "Cherry", 
       MaxStudents = 20 
      } 

     }); 

は、それが誰を助けることを願っています。

+0

ネストされたエンティティではなく、既に存在する場合にのみ、これは 'ClassSchedule'を更新することに注意してください。 –