Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将行插入关系表的最佳方法_C#_Sql Server_Excel_Linq_Entity Framework - Fatal编程技术网

C# 将行插入关系表的最佳方法

C# 将行插入关系表的最佳方法,c#,sql-server,excel,linq,entity-framework,C#,Sql Server,Excel,Linq,Entity Framework,我在单击按钮事件中有以下代码: private void btn_addtodb_Click(object sender, EventArgs e) { try { stopwatch.Start(); using (var context = new ScheduleDatabaseEntities()) { foreach (string fullfilePath in ExcelfilesPath)

我在单击按钮事件中有以下代码:

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;
    }
}
private void btn\u addtodb\u单击(对象发送方,事件参数e)
{
尝试
{
秒表。开始();
使用(var context=new ScheduleDatabaseEntities())
{
foreach(ExcelFilePath中的字符串fullfilePath)
{
Excel.Workbook theWorkbook=app.Workbooks.Open(完整文件路径);
对于(内部i=1;内部a.房间==房间);
if(findRoom==null)
{
var roomEntity=新房间{Room=Room};
context.Rooms.Add(roomEntity);
SaveChanges();
返回roomEntity.RoomId;
}
其他的
返回findRoom.RoomId;
}
}
私有int?FindClassId(字符串sClass)
{
使用(var context=new ScheduleDatabaseEntities())
{
if(sClass==null)
返回null;
var findClass=context.Turmas.FirstOrDefault(a=>a.Turma==Turma);
if(findClass==null)
{
var classEntity=新类{Class=sClass};
context.Classes.Add(classEntity);
SaveChanges();
返回classEntity.ClassId;
}
其他的
返回findClass.ClassId;
}
}
问题是,与单个表插入相比(这是我以前的版本,但我想使用关系表更好地进行组织),执行此操作所需的时间比我预期的稍多,我知道在不同的表中插入会更慢,但没有任何解决方案可以让插入速度更快一点


注意:方法是读取一些计划文件(在excel中)我已经有了要插入数据库的值,所以我必须在关系表中插入这些值,并用该ID填充行。我已经有了一个版本,这个版本速度很快,但只是一个表,这是一个糟糕的设计(仅用于测试目的)。有什么建议吗?

将您的上下文从应用程序开始保存到结束,然后在应用程序开始时对每个数据库集调用Load。这将把所有数据加载到数据库集对象的本地属性中。然后您可以在该列表中使用linq,因为我相信调用context.Salas.将导致EF查询数据库并生成对象ich比较慢。而且你不需要在点击按钮时创建新的上下文

//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;
    }
//应用程序启动:
var context=new ScheduleDatabaseEntities();
context.Subjects.Load();
私有异步void按钮事件(…)
{
int result=await findsubject();
}
//按钮代码
私有异步任务findSubject(字符串主题)
{
var findSubject=context.Subjects.Local.FirstOrDefault(a=>a.Subject==Subject);
if(findSubject==null)
{
var subjectEntity=新主题{Subject=Subject};
context.Subjects.Add(subjectEntity);
wait context.saveChangesSync();
返回subjectEntity.SubjectId;
}
其他的
返回findSubject.subject;
}

类似于此。如果需要,您可以将FindSubject异步设置为void,然后在按钮事件中正常调用它。

尝试使用单个上下文,并在结尾仅保存一次。那么,请简单回答一个问题,如果我在再次执行getId方法时这样做,我将不会更新表,因为我没有保存更改(),还是我错了?我对EF的这一点不太确定。你可以试试吗?萨拉斯应该是房间,我没有正确翻译。它已经编辑好了,我会试试代码,顺便说一句,我真的很感激。如果你还有问题,请告诉我。我一直在努力提高EF的性能。