2017-01-03 70 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是我可以執行命令的實體框架上下文。

相關問題