2015-03-31 8 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) у каждого преподавателя и извлекать их в базу данных для выполнения расписания классов из нее. У меня уже есть значения, которые я хочу вставить в базу данных, поэтому мне нужно вставить реляционные таблицы и заполнить строку этим идентификатором. У меня уже была версия, где это было быстро, но это была только одна таблица, которая была плохим дизайном (это было только для целей тестирования). Какие-либо предложения?

+0

Попробуйте использовать один контекст и сохраняйте только один раз в конце. – Blorgbeard

+0

Просто быстрый вопрос, если я это сделаю, когда снова получу метод getId, у меня не будет обновленной таблицы, потому что я не сделал SaveChanges(), или я ошибаюсь? – Exprove

+0

На самом деле я не уверен в этом для EF. Вы могли бы попробовать? – Blorgbeard

ответ

0

Сохраняйте свой контекст со своих приложений, начинайте работу, а затем вызывайте Load на каждом dbset при запуске приложения. Это загрузит все данные в локальное свойство в объекте dbset. Тогда вы можете просто использовать linq в этом списке, потому что я верю в контекст вызова. 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; 
    } 

что-то в этом духе. вы можете просто сделать async void FindSubjectId, если хотите, и просто вызвать его нормально в событии кнопки.

+0

Салас - это Комнаты, я не перевел это правильно. Он уже отредактирован, я попробую код, thx btw, я очень благодарен. – Exprove

+0

Если у вас есть больше вопросов, дайте мне знать. Я сам пытался улучшить работу EF. – shady

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