我正在尝试将表传递给存储过程以进行批量插入更新。我在表的数据库中创建了一个自定义类型,并使用表参数(自定义类型)创建了一个过程。
但是,当我在Entity Framework中更新模型时,它不会生成传递表参数的正确代码。
以下是我的存储过程的声明:
CREATE PROCEDURE [dbo].[TimeClock_UpdateTimeClockData]
@dateTimeFrom date,
@dateTimeTo date,
@employeeEarnings EmployeeEarningsTable readonly
AS
BEGIN
--- insert/update operations
END
这是Entity Framework生成的代码:
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 :(得分:0)
实体框架deos不生成使用table参数调用存储过程的代码。但是,我找到了一种从上下文变量调用sp的方法,并传递table参数,如下所示:
var parameter = new SqlParameter("EmployeeEarnings", datatableEarnings);
parameter.TypeName = "dbo.UDT_EmployeeEarnings";
_context.Database.ExecuteSqlCommand("TimeClock_UpdateTimeClockData @EmployeeEarnings", parameter);
如果没有为参数定义类型名称,则会引发错误。因此,通过声明一个新的SqlParameter然后分配TypeName属性来解决这个问题。
_context
是实体框架上下文,通过它我可以执行命令。