Entity framework 实体框架存储过程调用明显较慢

Entity framework 实体框架存储过程调用明显较慢,entity-framework,Entity Framework,我使用实体框架的性能显著降低的原因是什么?下面两个版本的代码都实现了完全相同的目标 Excel文档中有1700条记录正在插入到SQL Azure数据库中 使用实体框架执行时间:4:55 foreach (IXLRow row in wb.Worksheet(1).RowsUsed()) { dbContext.InsertQuestion(row.Cell("B").Value.ToString().Trim(), row.Cell("A").Value.ToString().Trim(

我使用实体框架的性能显著降低的原因是什么?下面两个版本的代码都实现了完全相同的目标

Excel文档中有1700条记录正在插入到SQL Azure数据库中

使用实体框架执行时间:4:55

foreach (IXLRow row in wb.Worksheet(1).RowsUsed())
{
    dbContext.InsertQuestion(row.Cell("B").Value.ToString().Trim(), row.Cell("A").Value.ToString().Trim(), row.Cell("C").Value.ToString().Trim(), row.Cell("D").Value.ToString().Trim(), null);
}
非实体框架执行时间:1:54

foreach (IXLRow row in wb.Worksheet(1).RowsUsed())
{
    using (SqlCommand cmd = new SqlCommand("InsertQuestion", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@CategoryName", row.Cell("B").Value.ToString().Trim()));
        cmd.Parameters.Add(new SqlParameter("@TypeName", row.Cell("A").Value.ToString().Trim()));
        cmd.Parameters.Add(new SqlParameter("@Text", row.Cell("C").Value.ToString().Trim()));
        cmd.Parameters.Add(new SqlParameter("@Answer", row.Cell("D").Value.ToString().Trim()));
        cmd.ExecuteNonQuery();
    }
}

首先,在数据库上创建一个数据类型(就像数据库有VARCHAR和INT类型一样,您可以创建自己的类型。)

其次,将新类型用作存储过程的参数

CREATE PROCEDURE InsertSurveyAnswers
    @Answers SurveyAnswerType READONLY
AS

INSERT INTO Answers
(CategoryName, TypeName, [Text], Answer)
SELECT CategoryName, TypeName, [Text], Answer 
FROM @Answers

GO
第三,通过加载与新类型类似的表,从C#代码调用存储的过程:

DataTable tAnswers = new DataTable();
tAnswers.Columns.Add("CategoryName", typeof(String));
tAnswers.Columns.Add("TypeName", typeof(String));
tAnswers.Columns.Add("Text", typeof(String));
tAnswers.Columns.Add("Answer", typeof(String));

var rows = wb.Worksheet(1).RowsUsed();
var totalRows = rows.Count();
int index = 0;
int bufferSize;

using (SqlCommand cmd = new SqlCommand("InsertAnswers", conn))
{
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add(new SqlParameter("@SurveyAnswerType",              
                                        SqlDbType.Structured));

 while(index < totalRows)
 {
    int bufferSize = Math.Min(200, totalRows - index);
    foreach (index = index; index < bufferSize; index++)
    {
       var newRow = tAnswerstAnswers.NewRow();
       newRow[0] = rows[index].Cell("A").Value.ToString().Trim();
       newRow[1] = row[index].Cell("B").Value.ToString().Trim();
       newRow[2] = row[index].Cell("C").Value.ToString().Trim();
       newRow[3] = row[index].Cell("D").Value.ToString().Trim();
       tAnswerstAnswers.AddRow(newRow);
    }        
     cmd.Parameters["@SurveyAnswerType"].Value = tAnswers;  
     cmd.ExecuteNonQuery();
 }
}
DataTable tAnswers=newdatatable();
添加(“CategoryName”,typeof(String));
添加(“TypeName”,typeof(String));
tAnswers.Columns.Add(“Text”,typeof(String));
tAnswers.Columns.Add(“应答”,typeof(字符串));
var rows=wb.Worksheet(1.RowsUsed();
var totalRows=rows.Count();
int指数=0;
int缓冲区大小;
使用(SqlCommand cmd=newsqlcommand(“InsertAnswers”,conn))
{
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(新的SqlParameter(“@SurveyAnswerType”),
SqlDbType.Structured);
while(索引
注意事项:

  • SqlParameter使用SqlDbType.Structured

  • 连接只打开和关闭/破坏一次,而不是一次
    每行

  • 您应该使用缓冲区大小来查看最佳大小

  • 您必须提出自己的实体框架版本
    这-但我怀疑你每次打电话都会有开销 将使用此模式最小化

DataTable tAnswers = new DataTable();
tAnswers.Columns.Add("CategoryName", typeof(String));
tAnswers.Columns.Add("TypeName", typeof(String));
tAnswers.Columns.Add("Text", typeof(String));
tAnswers.Columns.Add("Answer", typeof(String));

var rows = wb.Worksheet(1).RowsUsed();
var totalRows = rows.Count();
int index = 0;
int bufferSize;

using (SqlCommand cmd = new SqlCommand("InsertAnswers", conn))
{
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add(new SqlParameter("@SurveyAnswerType",              
                                        SqlDbType.Structured));

 while(index < totalRows)
 {
    int bufferSize = Math.Min(200, totalRows - index);
    foreach (index = index; index < bufferSize; index++)
    {
       var newRow = tAnswerstAnswers.NewRow();
       newRow[0] = rows[index].Cell("A").Value.ToString().Trim();
       newRow[1] = row[index].Cell("B").Value.ToString().Trim();
       newRow[2] = row[index].Cell("C").Value.ToString().Trim();
       newRow[3] = row[index].Cell("D").Value.ToString().Trim();
       tAnswerstAnswers.AddRow(newRow);
    }        
     cmd.Parameters["@SurveyAnswerType"].Value = tAnswers;  
     cmd.ExecuteNonQuery();
 }
}