2017-01-03 71 views
0

我试图将表传递给存储过程以进行批量插入更新。我在表中为数据库创建了一个自定义类型,并使用table参数(自定义类型)创建了一个过程。在存储过程中传递表的最佳方式是什么

但是,当我在实体框架中更新模型时,它不会生成传递表参数的正确代码。

以下是我的存储过程的声明:

CREATE PROCEDURE [dbo].[TimeClock_UpdateTimeClockData] 
    @dateTimeFrom date, 
    @dateTimeTo date, 
    @employeeEarnings EmployeeEarningsTable readonly 
AS 
BEGIN 
    --- insert/update operations 
END 

这是实体框架生成的代码:

public virtual int TimeClock_UpdateTimeClockData(Nullable<System.DateTime> dateTimeFrom, Nullable<System.DateTime> dateTimeTo) 
{ 
    var dateTimeFromParameter = dateTimeFrom.HasValue ? 
     new SqlParameter("dateTimeFrom", dateTimeFrom) : 
     new SqlParameter("dateTimeFrom", typeof(System.DateTime)); 

    var dateTimeToParameter = dateTimeTo.HasValue ? 
     new SqlParameter("dateTimeTo", dateTimeTo) : 
     new SqlParameter("dateTimeTo", typeof(System.DateTime)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery("TimeClock_UpdateTimeClockData @dateTimeFrom,@dateTimeTo", dateTimeFromParameter, dateTimeToParameter); 
} 

很简单,就是忽略了表值参数。

Entity Framework将表传递给过程是否有任何解决方法?

或者是否有任何替代方法将多个记录传递给存储过程?我知道Xml参数,但我想避免这种情况,因为我想传递更大的数据集并且不想引起任何性能问题。

+0

尝试使用'ExecuteSqlCommand'或'SqlQuery '代替'ExecuteStoreQuery',只是改变它。 –

回答

0

实体框架deos不会生成用于使用table参数调用存储过程的代码。然而,我发现了一个方法来调用从上下文变量SP和传递表参数如下:

var parameter = new SqlParameter("EmployeeEarnings", datatableEarnings); 
parameter.TypeName = "dbo.UDT_EmployeeEarnings"; 
_context.Database.ExecuteSqlCommand("TimeClock_UpdateTimeClockData @EmployeeEarnings", parameter); 

如果没有定义类型名称参数,它抛出一个错误。因此,通过声明一个新的SqlParameter,然后分配TypeName属性来解决这个问题。

_context是我可以执行命令的实体框架上下文。

相关问题