2015-03-31 42 views
0

我有一個點擊按鈕事件裏面的代碼:最好的辦法,將行插入到關係表

private void btn_addtodb_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     stopwatch.Start(); 

     using (var context = new ScheduleDatabaseEntities()) 
     { 
      foreach (string fullfilePath in ExcelfilesPath) 
      { 
       Excel.Workbook theWorkbook = app.Workbooks.Open(fullfilePath); 
       for (int i = 1; i <= theWorkbook.Worksheets.Count; i++) 
       { 
        Excel.Worksheet theWorksheet = theWorkbook.Worksheets[i]; 
        Excel.Range excelRange = theWorksheet.UsedRange; 
        object[,] valueArray = (object[,])excelRange.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault); 
        string teacherName = Convert.ToString(valueArray[9, 2]); 

        for (int k = 4; k <= 12; k = k + 2) 
        { 
         for (int j = 16; j <= 35; j = j + 2) 
         { 
          if (j == 24) 
           j--; 
          if (valueArray[j, k] != null) 
          { 
           int timeId = Convert.ToInt32(valueArray[j, 1]); 
           string startTime = Convert.ToString(valueArray[j, 2]); 
           string endTime = Convert.ToString(valueArray[j, 3]); 
           string room = Convert.ToString(valueArray[j, k + 1]); 
           string weekDay= Convert.ToString(valueArray[14, k]); 
           string sClass, subject; 
           string str = Convert.ToString(valueArray[j, k]); 

           if (Char.IsNumber(str[0]) && str.Contains(" ")) 
           { 
            string[] splistring = str.Split(new[] { " " }, 2, StringSplitOptions.None); 
            sClass = splistring[0]; 
            subject = splistring[1]; 
           } 
           else 
           { 
            sClass= null; 
            subject = str; 
           } 
           context.Schedule.Add(new Schedule { TimeId= timeId , WeekDay= weekDay, SubjectId= FindSubjectId(subject), TeacherId= FindTeacherId(teacherName), RoomId= FindRoomId(room), ClassId= FindClassId(sClass) }); 
          } 
         } 
        } 
       } 
      } 
      context.SaveChanges(); 
     } 
     stopwatch.Stop(); 
     MessageBox.Show("Done! Time: "+stopwatch.ElapsedMilliseconds); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

private int? FindSubjectId(string subject) 
{ 
    using (var context = new ScheduleDatabaseEntities()) 
    { 
     var findSubject = context.Subjects.FirstOrDefault(a => a.Subject == subject); 
     if (findSubject == null) 
     { 
      var subjectEntity = new Subjects { Subject= subject}; 
      context.Subjects.Add(subjectEntity); 
      context.SaveChanges(); 
      return subjectEntity.SubjectId; 
     } 
     else 
      return findSubject.SubjectId; 
    } 
} 

private int? FindTeacherId(string teacher) 
{ 
    using (var context = new ScheduleDatabaseEntities()) 
    { 
     var findTeacher = context.Professores.FirstOrDefault(a => a.Professor == professor); 
     if (findTeacher == null) 
     { 
      var teacherEntity = new Teachers{ Teacher = teacher}; 
      context.Professores.Add(teacherEntity); 
      context.SaveChanges(); 
      return teacherEntity.TeacherId; 
     } 
     else 
      return findTeacher.TeacherId; 
    } 
} 

private int? FindRoomId(string room) 
{ 
    using (var context = new ScheduleDatabaseEntities()) 
    { 
     var findRoom = context.Rooms.FirstOrDefault(a => a.Room == room); 
     if (findRoom == null) 
     { 
      var roomEntity = new Rooms{ Room = room}; 
      context.Rooms.Add(roomEntity); 
      context.SaveChanges(); 
      return roomEntity.RoomId; 
     } 
     else 
      return findRoom.RoomId; 
    } 
} 

private int? FindClassId(string sClass) 
{ 
    using (var context = new ScheduleDatabaseEntities()) 
    { 
     if (sClass == null) 
      return null; 
     var findClass = context.Turmas.FirstOrDefault(a => a.Turma == turma); 
     if (findClass == null) 
     { 
      var classEntity = new Classes { Class = sClass}; 
      context.Classes.Add(classEntity); 
      context.SaveChanges(); 
      return classEntity.ClassId; 
     } 
     else 
      return findClass.ClassId; 
    } 
} 

的問題是,執行此需要多一點比我預想的有一個表的插入比較(這是我以前的版本,但我想做關係表是更好的組織),我知道它會慢插入不同的表,但沒有任何解決方案讓這個更快一點?

注意:這個想法是從每個老師那裏讀取一些日程表文件(在Excel中),並將它們檢索到一個數據庫,以便從中進行課程安排。我已經有了要插入到數據庫的值,所以我必須插入關係表並使用該ID填充行。我已經有了一個很快的版本,但只有一張表,這是一個糟糕的設計(它僅用於測試目的)。有什麼建議麼?

+0

嘗試使用單個上下文並僅在末尾保存一次。 – Blorgbeard 2015-03-31 00:56:00

+0

只是一個簡單的問題,如果我這樣做,當我再次執行getId方法時,我將不會更新表,因爲我沒有SaveChanges(),或者我錯了嗎? – Exprove 2015-03-31 01:06:25

+0

對於EF我其實並不確定。你可以試試嗎? – Blorgbeard 2015-03-31 01:10:33

回答

0

從您的應用程序開始到結束持續保存上下文,然後在應用程序啓動時調用每個dbset的Load。這會將所有數據加載到dbset對象的本地屬性中。那麼你可以在列表中使用linq,因爲我相信調用context.Salas。會導致EF查詢數據庫並生成較慢的對象。此外,您不必在點擊按鈕上創建新的上下文。

//app start: 
var context = new ScheduleDatabaseEntities(); 
context.Subjects.Load(); 

private async void ButtonEvent(...) 
{ 
    int result = await FindSubjectId(); 
} 

//button code 
private async Task<int?> FindSubjectId(string subject) 
{ 
     var findSubject = context.Subjects.Local.FirstOrDefault(a => a.Subject == subject); 
     if (findSubject == null) 
     { 
      var subjectEntity = new Subjects { Subject= subject}; 
      context.Subjects.Add(subjectEntity); 
      await context.SaveChangesAsync(); 
      return subjectEntity.SubjectId; 
     } 
     else 
      return findSubject.SubjectId; 
    } 

這樣的事情。你可以使FindSubjectId異步無效,如果你想,只需在按鈕事件中調用它。

+0

薩拉斯假設是客房,我沒有正確翻譯。它已經被編輯,我會嘗試代碼,thx順便說一句,我真的很感激。 – Exprove 2015-03-31 19:23:40

+0

如果您有任何問題,請告訴我。我一直在努力提高EF性能。 – shady 2015-03-31 19:35:39