妥善处理EF DBContext

时间:2016-07-19 22:28:37

标签: c# entity-framework-6 dbcontext

情况: 我将很多xlsx文件导入到mysql数据库中,我想使用EF6。连接工作,我可以导入。然而,出了点问题,我觉得我错过了一个至关重要的部分。

class Importer
{
    public string ImportExcercise(C_patient patient, C_excercise excercise, List<C_breath> breaths, int PatientHasMultipleExercises)
    {
        try
        {
            using (var dbentries = new bxbEntities())
            {                     
                if (PatientHasMultipleExercises == 0)
                {
                    dbentries.C_patient.Add(patient);
                    dbentries.SaveChanges();
                    Console.WriteLine("Added Patient...");
                }                   
                excercise.C_patientID = patient.C_patientID;
                dbentries.C_excercise.Add(excercise);                    
                dbentries.SaveChanges();
                int exerid = excercise.C_excerciseID;
                Console.WriteLine("Added Excercise...");
                int i = 0;
                foreach (C_breath b in breaths)
                {
                    b.C_excerciseID = exerid;
                    dbentries.C_breath.Add(b);                      
                    Console.WriteLine("Added BxB record {0}...", i);
                    i++;
                }
                dbentries.SaveChanges();                    
            }
            return "import success!";
        }
        catch (DbEntityValidationException dbEx)
        {
            foreach (var validationErrors in dbEx.EntityValidationErrors)
            {
                foreach (var validationError in validationErrors.ValidationErrors)
                {
                    Trace.TraceInformation("Property: {0} Error: {1}",
                                            validationError.PropertyName,
                                            validationError.ErrorMessage);
                }
            }
        }
        return "";
    }
}

我这样叫这个转换器:

public string StrokePatientExecFolder(string Folder)
    {
        string[] files = Directory.GetFiles(Folder);
        int i = 0;

        while (i<files.Length)
        {

            if (!((File.GetAttributes(files[i]) & FileAttributes.Hidden) == FileAttributes.Hidden))
            {
                xlsdata data = new xlsdata();
                Console.WriteLine("File: {0}", files[i]);
                data.xlsread(files[i]);
                StrokePatientConverter(data);
                Importer imp = new Importer();
                imp.ImportExcercise(p, e, b, i);
                b.Clear();
                i++;
            }

        }

        return "converted!";
    }

所以这就是出错:第一次一切顺利。当导入第二个文件(或至少是呼吸)时,它们被添加到dbentries中存在的前一组呼吸中。我澄清一下:第一个xlsx包含250次呼吸 - 它们被导入。第二个文件包含300次呼吸 - &gt;导入550次呼吸,所有呼吸均使用相同的excerciseID。

到目前为止我尝试了什么: 1)我试图调用dbentries.Dispose();但我发现由于'使用阻止',这是多余的。 2)首先,进口商imp = new Importer();全球宣布。然后我在while循环的每次迭代中在本地声明它,以确保对象为空。令我惊讶的是,事实并非如此。 3)我在dbentries上添加了一块手表。 第一次迭代:dbentries.C_breath - &gt;在foreach循环之前 - &gt;计数= 0.在foreach循环之后 - &gt; count = 250。 第二次迭代:dbentries.C_breath - &gt;在foreach循环之前 - &gt; Count = 250(这怎么可能?应该处理DBContext?)。在foreach循环之后 - &gt; count = 550.

我觉得我在这里缺少一些基本的东西。这是我的第一个EF6项目...希望你们能帮助我!

按要求添加模型 enter image description here

0 个答案:

没有答案