Entity Frameworkで何も返さないストアドプロシージャを使用しようとしています。
私は次のことをしました:
関数を追加しました(ストアドプロシージャを右クリック->追加->関数インポート->複合型->列情報の取得->新規複合型の作成)
私の関数名:summarySP_Result
。プロジェクトをビルドした後、エンティティクラスはGenerated_code
(BusinessAccount.web.g.cs
)で生成されません
ただし、テーブルとビューのエンティティクラスはすべて作成されますが、ストアドプロシージャは作成されません。
BusinessAccount.web.g.cs
で生成されたエンティティクラスではない理由を誰かが説明できますか?
更新:
ReturnDataFromTemTable_result
クラスで作成されたXXXXXX.web.g.cs
エンティティクラスを確認させてください。
のような:
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/BizFramework.Web.Model")]
public sealed partial class ReturnDataFromTemTable_Result : Entity
{
-------------------
}
OK-これを行うための段階的な方法は次のとおりです。
(1)EDMXファイルにストアドプロシージャを追加します(最初に作成したとき、または後で[Update model from database
]を使用してそのストアドプロシージャを選択して)
(2)モデルにストアドプロシージャを作成したら、Model Browser
を使用してFunction Import
を追加します。
(3)次に表示されるダイアログは非常に重要です-(1)ストアドプロシージャが複雑な型のコレクションを返すことを定義し、(2)そのストアドプロシージャから列情報を取得してどの列を知る必要があるか(3)Visual Studioに、その列情報に基づいて新しい複合型を生成するように指示します。
(4)それを行うと、モデルブラウザーの概念モデルセクションにストアドプロシージャが表示され、新しく生成された複合型も表示されるはずです。
それでも解決しない場合は、関数インポートを追加した後、ソリューションエクスプローラーに移動し、{name} .Context.ttファイルを右クリックして、「カスタムツールの実行」を実行します。メソッドは、派生したContextクラスに表示されます。
これは、私が使用しているVisual Studio 2012のバグのようです。Update1を適用していないため、修正されるかどうかを確認します。
これはロス・ブリゴリ用です
ストアドプロシージャの先頭に次の行を追加してみてください。
FMTONLY OFFの設定インポートが完了したら、これを削除できます。
Sandeepが言ったように、EFは動的クエリまたは一時テーブルから結果セットを構築するストアドプロシージャのインポートをサポートしていません。
ただし、SP全体を書き換える必要はありません。
動的SQLまたは一時テーブルを使用せずに、正しい行形式を返す同じ名前の別の行を記述するだけです。次に、EF SP関数を追加します。これにより、複合型が自動生成されます。
編集:実際には、SPの上部でコメントを作成する方が簡単です。これは、CASTSで指定されたすべてのデータ型の目的の行をすぐに選択します。SPをEFに挿入し、コードのコメントを外します。
例えば.
CREATE PROCEDURE myProc()
として
ベギン
-次の行のコメントを解除してインポートします。
-SELECT CAST(0 AS int)AS column1Name、CAST( 'a' AS varchar(50))AS clumn2name
-SPコンテンツをインポートするときにコメントアウトします。
<適切SPコンテンツ>
終わり
次に、保存されたprocをドロップして、オリジナルを作成します。
この一時インポートを保存しますSPただし、必要になった場合に備えて作成しました。
create procedure [dbo].[usp_InsertOrUpdate]
/*if your table(tbl_InsertOrUpdate) as 3 columns like uniqueid,col1,col2*/
@uniqueId bigint NULL,/*if insert send value as null or 0*/
@col1 bigint null,
@col2 [varchar](500) NULL
as
begin
set nocount ON
SET FMTONLY OFF
/* for giving result which column updated(uniqueId) and is it insert or update(IsInsert)*/
declare @varResult table (uniqueId bigint ,IsInsert bit )
/*create a var table before inserting original table*/
declare @varInsertOrUpdate table (
uniqueId bigint ,
col1 [bigint] ,
col2 [varchar]
)
/*default we are feel as update only*/
insert into @varResult (uniqueId,IsInsert) values (@uniqueId,0)
/*insert into var table*/
INSERT INTO @varInsertOrUpdate (uniqueId,col1,col2)
VALUES
(@uniqueId,@col1,@col2)
/*Insert into original table with where condition without if else*/
INSERT INTO tbl_InsertOrUpdate (col1,col2)
select col1,col2 from @varInsertOrUpdate
where uniqueId!=0;
/*if its insert updating result returning table*/
update @varResult set
uniqueId=IDENT_CURRENT('tbl_InsertOrUpdate'),
IsInsert=1 where @uniqueId=0;
/*updating table where @uniqueid is null or empty*/
UPDATE tbl_InsertOrUpdate
SET col1=@col1,
col2=@col2,
WHERE uniqueId=@uniqueId and @uniqueId!=0
select * from @varResult
end
EFは、結果セットを構築するストアドプロシージャのインポートをサポートしていません。
代わりにテーブル変数を使用するようにストアドプロシージャを書き直してください。ストアドプロシージャと関数インポートは、ストアドプロシージャも追加しない限り、複雑な型を生成しないため、更新する前に必ずモデルから削除してください。または、関数のインポートプロパティに移動し、ストアドプロシージャを更新した後に列情報の取得機能を使用します。
私にとって、ストアドプロシージャをEFにインポートすると、複雑なエンティティの戻りオブジェクトが(自動的に)生成されないという問題があります。ただし、sproc(別名ストアドプロシージャ)のセクションをコメントアウトした後、ストアドプロシージャを再インポート(関数インポート編集画面の[列情報の取得]ボタンを使用して更新)すると、複合型生成される可能性があります!
要するに、EFが複合型を生成しない原因となるwhere句(または多分何か)が存在する可能性があります。 sprocのセクションをコメントアウトして、sprocを再インポートしてみてください。
更新:
上記の調査に加えて、複雑なエンティティが生成されなかった理由は、sprocが(典型的なテーブルの代わりに)ビューを使用しているためであることがわかりました。好奇心のために、ビューを別のテーブルに変更して、何が起こるかを確認し、複雑なエンティティを生成しました。
したがって、要するに、ビューがある場合、複合エンティティは自動的に生成されないように見えます。試すために、私は一時的にビューをリッピングし、sprocを再インポートし、Complex Entityを生成してから、ビューを元に戻しました。しかし今、私のコードは例外を出します。
これについては後で詳しく説明します=)
更新:
問題を修正しました。本当にばかげた間違い!私が使用していたビュー名は、正しいスペル= Dではありませんでした。私はsprocを作成したときにSQL Serverによってエラーがスローされなかったことに怒っています。...それは人生だと思います:)
これは、複数の検索を実装するためのmy SP
***************************************************
CREATE PROCEDURE [dbo].[uspSEARCH_POSITIONS]
@OBJ_TYPE_REQUEST varchar(2000),--'FIRST_NAME;SEARCHVALUE|LAST_NAME;SEARCHVALUE|JOB_DESCRIPTION;SEARCHVALUE'
@DELIMITER varchar(10) --'| Which seperates the col;searchvalue|col;searchvalue
AS
BEGIN
SET FMTONLY OFF
DECLARE
@lLastName varchar(100),
@lFirstName varchar(100),
@lPositionNumber varchar(20),
@lJobDescription varchar(50),
@lJobCode varchar(20),
@lOccupancyIndicator varchar(50),
@ldeleimitercolsearchval varchar(10)
SET @ldeleimitercolsearchval =';'
CREATE TABLE #TempTable (ColSearchValues VARCHAR(2000))
INSERT INTO #TempTable
SELECT * FROM [dbo].[fnSplit](@OBJ_TYPE_REQUEST,@DELIMITER)--'fname;searchvalfname|lname;searchvallname|jobcode;searchvaljobcode','|')
SELECT @lLastName=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%last%'
SELECT @lFirstName =SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%first%'
SELECT @lPositionNumber =SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%position%'
SELECT @lJobDescription=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%jobd%'
SELECT @lJobCode=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%jobc%'
SELECT @lOccupancyIndicator=SUBSTRING(ColSearchValues,CHARINDEX(@ldeleimitercolsearchval ,ColSearchValues)+1,LEN(ColSearchValues)) from #TempTable where lower(ColSearchValues) like '%ccupancy%'
SELECT [PS].[POSITION_NUMBER]
,[PS].[COST_CENTER]
,[PS].[JOB_CODE]
,[PS].[JOB_CODE_DESCRIPTION]
,[PS].[SITE_CODE]
,[EMP].[EMPLOYEE_ID]
,[EMP].[EIN]
,[EMP].[GRADE]
,[EMP].[LOGIN_ID]
,[EMP].[FIRST_NAME]
,[EMP].[LAST_NAME]
,LTRIM(RTRIM(ISNULL([EMP].[LAST_NAME],''))) + ',' +LTRIM(RTRIM(ISNULL([EMP].[FIRST_NAME],''))) AS [FULL_NAME]
,[EMP].[DISTRICT]
,[EMP].[SUPERVISOR_EIN]
,COUNT(*) OVER() AS TOTAL_RECORD_COUNT
FROM [DBSERVER].[dbo].[uvwPOSITION_SEARCH] PS
LEFT JOIN [DBSERVER].[dbo].[uvwEMPLOYEES] EMP
ON PS.POSITION_NUMBER=EMP.POSITION_NUMBER
WHERE
(@lLastName IS NULL OR [LAST_NAME] LIKE '%' + @lLastName + '%')
AND (@lFirstName IS NULL OR [FIRST_NAME] LIKE '%' + @lFirstName + '%')
AND (@lPositionNumber IS NULL OR [PS].[POSITION_NUMBER] LIKE '%' + @lPositionNumber + '%')
AND (@lJobDescription IS NULL OR [PS].[JOB_CODE_DESCRIPTION] LIKE '%' + @lJobDescription + '%')
AND (@lJobCode IS NULL OR [PS].[JOB_CODE] LIKE '%' + @lJobCode + '%')
AND (@lOccupancyIndicator IS NULL OR [EMP].[FILLED_VACANT] LIKE '%' + @lOccupancyIndicator + '%')
END
以下を使用して、edmxで上記のSPを消費できます
Entity Frameworkでのストアドプロシージャの複合型の追加
なぜEntity Frameworkがストアドプロシージャの列情報を表示できないのですか?
そして、あなたがSP以下が私のために働いた。ストアドプロシージャが更新された場合の複合型の更新 Entity Frameworkを取得して複合型を更新するにはどうすればよいか?
複雑な型を正しく追加するには、モデルブラウザに移動し、関数を右クリックして、編集を表示し、ダイアログボックスの塗りつぶしの編集をクリックします。関数の名前は、ストアドプロシージャの名前と同じである必要があります。 OKボタンをクリックします。これで関数が作成されました。次に、作成された関数を右クリックして、もう一度編集します。複合型ボタンの横に更新ボタンがあります。その更新ボタンを使用して更新します。これで、複合型が完全に作成されました。
モデルブラウザに移動します
既存の機能を変更する必要がある場合
[関数のインポート] >> [変更する関数を選択] >> [編集]をクリックします
関数を更新して更新する必要があり、列を追加する必要があることがわかります
複雑なタイプが表示されないという問題は、別の理由によっても発生する可能性があります。この問題は、テンポラリテーブルが次のように定義されているSPROCの構文エラーが原因で発生しました。驚いたことに、SQL Serverは、sprocのコンパイル時にエラーをスローしません。コンマを削除すると、問題が解決しました。
要するに、上記のソリューションのいくつかは特定の問題に応じて機能する可能性がありますが、私の提案は、SQLが無視するかもしれないがこの問題の根本的な理由であるような構文エラーがないかsprocをチェックすることです。ありがとう。