43

何も返さないEntityFrameworkのストアドプロシージャを使用しようとしています。

私は次のことをしました:

  1. 関数を追加しました(ストアドプロシージャを右クリック->追加->関数のインポート->複合型->列情報の取得->新しい複合型の作成-タイプ)

  2. 私の関数名:summarySP_Result。プロジェクトをビルドした後、エンティティクラスはGenerated_codeBusinessAccount.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
{
   -------------------
 }
4

11 に答える 11

74

OK-これを行うためのステップバイステップの方法は次のとおりです。

(1)ストアドプロシージャをEDMXファイルに追加します(最初に作成したとき、または後でUpdate model from databaseそのストアドプロシージャを使用して選択することにより)

(2)モデルにストアドプロシージャを作成したら、を使用して:Model Browserを追加します。Function Import

ここに画像の説明を入力してください

(3)ポップアップする次のダイアログは非常に重要です-(1)ストアドプロシージャが複合型のコレクションを返すことを定義してから、(2)そのストアドプロシージャから列情報を取得して、どの列かを知る必要があります戻り、(3)その列情報に基づいて新しい複合型を生成するようにVisualStudioに指示します。

ここに画像の説明を入力してください

(4)これを実行すると、モデルブラウザの概念モデルセクションにストアドプロシージャが表示され、新しく生成された複合型もそこに表示されます。

ここに画像の説明を入力してください

于 2012-10-11T07:21:51.947 に答える
16

それでも解決しない場合は、関数のインポートを追加した後、ソリューションエクスプローラーに移動し、{name} .Context.ttファイルを右クリックして、[カスタムツールの実行]を実行します。これで、メソッドは派生したContextクラスに表示されます。

ここに画像の説明を入力してください

これは、私が使用しているVisual Studio 2012のバグのようです。私は、Update 1を適用していません。これで、修正されるかどうかを確認します。

于 2012-11-28T18:19:30.450 に答える
16

これはロスブリゴリのためです

ストアドプロシージャの先頭に次の行を追加してみてください。

FMTONLYをオフに設定インポートが終了したら、これを削除できます。

出典: -Entity Frameworkがストアドプロシージャの列情報を表示できないのはなぜですか?

于 2014-07-21T16:57:00.183 に答える
4

Sandeepが述べたように、EFは、動的クエリまたは一時テーブルから結果セットを構築するストアドプロシージャのインポートをサポートしていません。

ただし、SP全体を書き直す必要はありません。

動的SQLや一時テーブルを使用せずに正しい行形式を返す、同じ名前の別の行を作成するだけです。次に、EF SP加算関数を使用します。これにより、複合型が自動生成されます。

編集:実際には、SPの上部にコメントを付けて、CASTSで指定されたすべてのデータ型で目的の行をすぐに選択する方が簡単です。SPをEFにインポートする必要がある場合は、コードのコメントを解除するだけです。

例えば

CREATE PROCEDURE myProc()
AS
BEGIN-
インポートする次の行のコメントを解除します。
-SELECTCAST(0 AS int)AS column1Name、CAST('a' AS varchar(50))AS clumn2name

-インポートする場合は、SPコンテンツをコメントアウトします。
<適切なSPコンテンツ>
END

次に、ストアドプロシージャをドロップして、オリジナルを作成します。
ただし、再度必要になった場合に備えて、作成したこの一時的なインポートSPを保存してください。

于 2017-08-02T15:06:50.137 に答える
3

EFは、以下から結果セットをビルドするストアドプロシージャのインポートをサポートしていません。

  • 動的クエリ
  • 一時テーブル

代わりにテーブル変数を使用するようにストアドプロシージャを書き直してください。ストアドプロシージャも追加しない限り、複合型は生成されないため、更新する前に、ストアドプロシージャと関数のインポートをモデルから削除することを忘れないでください。または、関数importプロパティに移動し、ストアドプロシージャを更新した後、列情報の取得機能を使用します。

于 2015-07-30T21:14:47.653 に答える
2
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
于 2017-04-27T11:06:55.013 に答える
2

複合型を正しく追加するには、モデルブラウザに移動し、関数を右クリックしてから[編集]を表示し、[編集]をクリックしてダイアログボックスに入力します。関数の名前は、ストアドプロシージャの名前と同じである必要があります。[OK]ボタンをクリックします。これで関数が作成されました。次に、作成した関数を右クリックして、もう一度編集します。複合型ボタンの横に更新ボタンがあります。その更新ボタンを使用して更新します。これで、複合型が完全に作成されました。

于 2017-11-14T09:18:38.963 に答える
1

これは、複数の検索を実装するための私の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を消費できます。

EntityFrameworkでのストアドプロシージャの複合型の追加

Entity Frameworkがストアドプロシージャの列情報を表示できないのはなぜですか?

そして、あなたがあなたのSPを更新しなければならない場合に備えて、以下は私のために働きました。ストアドプロシージャが更新された場合の複合型の更新 エンティティフレームワークを取得して複合型を更新するにはどうすればよいですか?

于 2014-07-24T21:39:58.630 に答える
1

私の場合、ストアドプロシージャをEFにインポートしても、複雑なエンティティの戻りオブジェクトが(自動的に)生成されないという問題があります。ただし、sproc(別名ストアドプロシージャ)のセクションをコメントアウトした後、ストアドプロシージャを再インポートすると(つまり、関数のインポート編集画面の[列情報の取得]ボタンを使用して更新すると)、複合型がその後、生成される可能性があります!

要するに、EFが複合型を生成しない原因となるwhere句(または何か他のもの)が存在する可能性があります。sprocのセクションをコメントアウトし、sprocをに再インポートしてみてください

アップデート:

上記の調査に加えて、複雑なエンティティが生成されなかった理由は、sprocが(通常のテーブルではなく)ビューを使用していたためであることがわかりました。好奇心のために、何が起こるかを確認するためにビューを別のテーブルに変更すると、複雑なエンティティが生成されました。

つまり、ビューがある場合、複雑なエンティティが自動的に生成されない可能性があるように見えます。試してみるために、ビューを一時的に取り除いて、sprocを再インポートし、Complex Entityを生成してから、ビューを元に戻しました。しかし、今では私のコードで例外が発生しています。

後でもっと学ぶときにこれについて更新します=)

アップデート:

問題を修正しました。本当にばかげた間違い!私が使用していたビュー名のスペルが正しくありません=D。sprocを作成したときにSQLServerによってエラーがスローされなかったことに少し腹を立てています.....それは人生だと思います:)ああ、問題は修正されました!

于 2014-12-12T22:20:01.647 に答える
0

複合型が表示されないという問題は、私が私たちの場合に直面した別の理由によっても発生する可能性があります。この問題は、一時テーブルが次のように定義されているSPROCの構文エラーが原因でした-create table #temp(col1 int、col2 nvarchar(100)、col3 nvarchar(100)、-末尾のコンマに注意してください); 驚いたことに、sprocをコンパイルするときにSQLServerはエラーをスローしません。カンマを削除すると、問題が修正されました。

要するに、上記の解決策のいくつかは特定の問題に応じて機能する可能性がありますが、SQLが無視する可能性があるが、この問題の根本的な理由である可能性がある構文エラーがないかsprocをチェックすることをお勧めします。ありがとう。

于 2018-10-04T08:12:28.253 に答える
0

モデルブラウザに移動します

既存の機能を変更する必要がある場合

[関数のインポート]の下で>>変更する関数を選択します>>[編集]をクリックします

更新するには関数を更新する必要があり、列を追加する必要があることがわかります

于 2019-07-15T19:49:39.313 に答える