2017-01-03 11 views
0

バルク挿入更新のストアドプロシージャにテーブルを渡そうとしています。私はテーブルのデータベースにカスタムタイプを作成し、テーブルパラメータ(カスタムタイプ)を持つプロシージャも作成しました。ストアドプロシージャでテーブルを渡す最も良い方法は

ただし、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); 
} 

それは単にテーブル値パラメータを無視している:

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

これは、Entity Frameworkで生成されたコードです。

プロシージャにテーブルを渡すためのEntity Frameworkの回避策はありますか?

複数のレコードをストアドプロシージャに渡す代替方法はありますか?私はXmlパラメータについて知っていますが、大きなデータセットを渡したいのでパフォーマンスの問題を招きたくないので、これを避けたかったのです。

+0

'ExecuteStoreQuery'ではなく' ExecuteSqlCommand'または 'SqlQuery 'を使用してみてください。 –

答えて

0

エンティティフレームワークは、テーブルパラメータを使用してストアドプロシージャを呼び出すためのコードを生成しません。しかし、私はコンテキスト変数からSPを呼び出すと、以下のようにテーブルパラメータを渡す方法を見つけました:

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

あなたはパラメータに型の名前を定義しない場合、それはエラーをスローします。したがって、新しいSqlParameterを宣言し、TypeNameプロパティを割り当てると、この問題が解決されます。

_contextは、コマンドを実行できるEntity Frameworkコンテキストです。

関連する問題