У меня есть этот код внутри кнопки нажмите событие:Лучший способ для вставки строк в реляционные таблицы
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) у каждого преподавателя и извлекать их в базу данных для выполнения расписания классов из нее. У меня уже есть значения, которые я хочу вставить в базу данных, поэтому мне нужно вставить реляционные таблицы и заполнить строку этим идентификатором. У меня уже была версия, где это было быстро, но это была только одна таблица, которая была плохим дизайном (это было только для целей тестирования). Какие-либо предложения?
Попробуйте использовать один контекст и сохраняйте только один раз в конце. – Blorgbeard
Просто быстрый вопрос, если я это сделаю, когда снова получу метод getId, у меня не будет обновленной таблицы, потому что я не сделал SaveChanges(), или я ошибаюсь? – Exprove
На самом деле я не уверен в этом для EF. Вы могли бы попробовать? – Blorgbeard