wake-up-neo.com

Hinzufügen von komplexen Typen für gespeicherte Prozeduren in Entity Framework

Ich versuche, eine gespeicherte Prozedur in Entity Framework zu verwenden, die nichts zurückgibt.

Ich habe folgendes gemacht:

  1. Funktion hinzugefügt (Rechtsklick auf gespeicherte Prozedur -> Hinzufügen -> Funktion Import -> Komplexer Typ -> Spalteninformationen abrufen -> Neuen Komplextyp erstellen)

  2. Mein Funktionsname: summarySP_Result. Nach dem Erstellen des Projekts wird die Entitätsklasse nicht in Generated_code (BusinessAccount.web.g.cs) generiert.

Entitätsklassen für Tabellen und Ansichten werden jedoch alle erstellt, jedoch nicht für gespeicherte Prozeduren.

Kann jemand die Idee geben, warum in BusinessAccount.web.g.cs keine Entitätsklasse generiert wird?

Update: 

Lassen Sie mich die ReturnDataFromTemTable_result-Entitätsklasse bestätigen, die in Ihrer XXXXXX.web.g.cs-Klasse erstellt wurde.

Mögen : 

[DataContract(Namespace="http://schemas.datacontract.org/2004/07/BizFramework.Web.Model")]
public sealed partial class ReturnDataFromTemTable_Result : Entity
{
   -------------------
 }
33
Kavitha

OK - so geht's Schritt für Schritt:

(1) Fügen Sie Ihre gespeicherte Prozedur zur EDMX-Datei hinzu (wenn Sie sie zum ersten Mal erstellen oder später mithilfe von Update model from database und der gespeicherten Prozedur auswählen).

(2) Sobald Sie die gespeicherte Prozedur in Ihrem Modell haben, fügen Sie mit Model Browser einen Function Import hinzu:

enter image description here

(3) Das nächste Dialogfeld ist äußerst wichtig. Sie müssen (1) definieren, dass die gespeicherte Prozedur eine Sammlung komplexer Typen zurückgibt. Anschließend müssen Sie (2) die Spalteninformationen aus der gespeicherten Prozedur abrufen, um zu erfahren, welche Spalten angezeigt werden Es wird zurückgegeben, und dann (3) weisen Sie Visual Studio an, einen neuen komplexen Typ basierend auf diesen Spalteninformationen zu generieren:

enter image description here

(4) Sobald Sie das getan haben, sollten Sie jetzt die gespeicherte Prozedur in Ihrem konzeptionellen Modellbereich im Modellbrowser sehen. Der neu generierte komplexe Typ sollte auch dort angezeigt werden:

enter image description here

64
marc_s

Wenn dies immer noch nicht gelöst ist, wechseln Sie nach dem Hinzufügen des Funktionsimports zum Projektmappen-Explorer, klicken Sie mit der rechten Maustaste auf Ihre {Name} .Context.tt-Datei und führen Sie "Benutzerdefiniertes Tool ausführen" aus. Die Methode wird jetzt in Ihrer abgeleiteten Context-Klasse angezeigt.

enter image description here

Dies scheint ein Fehler in Visual Studio 2012 zu sein. Dies ist, was ich verwende. Ich habe Update 1 nicht angewendet. Ich werde versuchen, herauszufinden, ob es das Problem behebt.

13
Chris Amelinckx

Dies ist für Ross Brigoli

Fügen Sie diese Zeile am Anfang Ihrer gespeicherten Prozedur ein:

SET FMTONLY OFFSie können diese entfernen, nachdem Sie den Import abgeschlossen haben.

Quelle: - Warum kann Entity Framework die Spalteninformationen meiner gespeicherten Prozedur nicht sehen?

11
Sandeep

Wie Sandeep sagte, unterstützt EF den Import von gespeicherten Prozeduren nicht, die Ergebnissätze aus dynamischen Abfragen oder temporären Tabellen erstellen.

Sie müssen jedoch nicht Ihren gesamten SP neu schreiben. 

Schreiben Sie einfach eine andere mit demselben Namen, die das richtige Zeilenformat zurückgibt, ohne dynamisches SQL oder eine temporäre Tabelle zu verwenden. Verwenden Sie dann die Funktion zum Hinzufügen von EF SP, die nun automatisch den komplexen Typ generiert. 

Bearbeiten: Es ist eigentlich einfacher, einen Kommentar oben in SP zu machen, der sofort die gewünschte Zeile mit allen mit CASTS angegebenen Datentypen auswählt. Wenn Sie den SP in EF importieren müssen, müssen Sie den Code auskommentieren. 

z.B. 

PROZEDURIEREN myProc ()
WIE
START
- Kommentieren Sie die folgende Zeile zum Importieren:
- SELECT CAST (0 AS int) AS column1Name, CAST ('a' AS varchar (50)) AS clumn2name 

- Kommentieren Sie den Inhalt von SP aus, wenn Sie ihn importieren möchten.
<richtiger SP Inhalt>
ENDE

Lassen Sie dann die gespeicherte Prozedur fallen und erstellen Sie das Original.
Speichern Sie diesen temporären Import SP, den Sie erstellt haben, falls Sie ihn erneut benötigen. 

3
Markus
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 [email protected], 
[email protected],
WHERE [email protected] and @uniqueId!=0

select *  from @varResult

end

EF unterstützt nicht den Import gespeicherter Prozeduren, deren Ergebnismenge aus folgenden Elementen besteht:

  • Dynamische Abfragen
  • Temporäre Tische

Schreiben Sie Ihre gespeicherte Prozedur neu, um stattdessen eine Tabellenvariable zu verwenden. Vergessen Sie nicht, den gespeicherten procudure- und den Funktionsimport vor der Aktualisierung aus Ihrem Modell zu löschen, da der komplexe Typ nicht generiert wird, es sei denn, er fügt auch die gespeicherte Prozedur hinzu. oder rufen Sie die Funktion zum Importieren von Eigenschaften auf und verwenden Sie die Funktion zum Abrufen von Spalteninformationen, nachdem Sie Ihre gespeicherte Prozedur aktualisiert haben.

2
Verard Sloggett

Ich habe Probleme, wenn beim Importieren meiner gespeicherten Prozedur in EF nicht das Rückgabeobjekt "Komplexe Entität" (automatisch) generiert wird. Nach dem Auskommentieren von Abschnitten meines Sproc (auch als gespeicherte Prozedur bezeichnet) stellte sich jedoch heraus, dass der gespeicherte Vorgang erneut importiert wurde (dh mit der Schaltfläche "Spalteninformationen abrufen" im Bildschirm "Funktionsimport bearbeiten"), dass der komplexe Typ könnte dann generiert werden!

Kurz gesagt, es könnte eine where-Klausel (oder etwas anderes) geben, die dazu führt, dass EF den komplexen Typ nicht generiert. Versuchen Sie, Abschnitte Ihres Sprocos zu kommentieren und das Sproc erneut in zu importieren

AKTUALISIEREN:

Nach meiner Untersuchung stellte ich fest, dass der Grund für das Generieren der komplexen Entität nicht darin lag, dass mein Sproc eine Ansicht (anstelle einer typischen Tabelle) verwendete. Aus Gründen der Neugierde habe ich die Ansicht in eine andere Tabelle geändert, nur um zu sehen, was passieren würde, und um die komplexe Entität zu generieren.

Kurz gesagt: Komplexe Entitäten werden möglicherweise nicht automatisch generiert, wenn Sie über eine Ansicht verfügen. Um es zu versuchen, habe ich die Ansicht vorübergehend ausgezogen, den Sproc erneut importiert, die komplexe Entität generiert und dann die Ansicht wieder eingefügt. Jetzt gibt mein Code jedoch Ausnahmen.

Wird später aktualisiert, wenn ich mehr lerne =)

AKTUALISIEREN:

Problem behoben Wirklich dummer Fehler! Der Viewname, den ich verwendete, war nicht richtig geschrieben = D. Ich bin irgendwie wütend, dass ein Fehler nicht von SQL Server geworfen wurde, als ich den Sproc erstellt habe ..... Ich denke, das ist das Leben :) Leider Problem jetzt behoben!

1
Jeff Moretti

Dies ist mein SP, um die Mehrfachsuche zu implementieren 

***************************************************

    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

Jetzt können Sie in edmx über SP verbrauchen, indem Sie unten verwenden

Hinzufügen komplexer Typen gespeicherter Prozeduren in Entity Framework

Warum kann Entity Framework die Spalteninformationen meiner gespeicherten Prozedur nicht sehen?

Für den Fall, dass Sie Ihr SP unten aktualisieren müssen, hat es für mich funktioniert Komplexe Typen aktualisieren, wenn gespeicherte Prozeduren aktualisiert werden Wie bekomme ich Entity Framework, um komplexe Typen zu aktualisieren?

1
Sandeep

Gehen Sie zum Modellbrowser

Wenn Sie vorhandene Funktionen ändern müssen

Wählen Sie unter Funktionsimporte >> die zu ändernde Funktion aus >> Klicken Sie auf Bearbeiten

Sie müssen die Funktion aktualisieren, um sie zu aktualisieren, und Sie können sehen, dass die Spalten hinzugefügt werden müssen

0
Joe

Um den komplexen Typ richtig hinzuzufügen, gehen Sie zu Modellbrowser, klicken Sie mit der rechten Maustaste auf die Funktion, zeigen Sie dann Bearbeiten an, klicken Sie auf Bearbeiten, und füllen Sie das Dialogfeld aus. Der Name der Funktion sollte mit dem Namen der gespeicherten Prozedur identisch sein. Klicken Sie auf die Schaltfläche OK. Nun wird die Funktion erstellt. Klicken Sie dann mit der rechten Maustaste auf die erstellte Funktion und bearbeiten Sie sie erneut. Neben der Schaltfläche für komplexe Typen befindet sich eine Aktualisierungsschaltfläche. Aktualisieren Sie sie mit dieser Aktualisierungsschaltfläche. Der komplexe Typ ist jetzt vollständig erstellt.

0
Thilini

Das Problem, dass komplexer Typ nicht auftritt, kann auch aus einem anderen Grund geschehen, dem ich in unserem Fall begegnet bin. Das Problem war auf einen Syntaxfehler im SPROC zurückzuführen, bei dem die temporäre Tabelle als unter -.__ definiert wurde. Create table #temp ( Col1 int, Col2 nvarchar (100), Col3 nvarchar (100) , - Beachten Sie das Komma am Ende ); Überraschenderweise gibt SQL Server keinen Fehler aus, wenn Sie den Sproc kompilieren. Durch das Entfernen des Kommas wurde das Problem behoben.

Kurz gesagt, während einige der oben genannten Lösungen je nach dem spezifischen Problem funktionieren, ist mein Vorschlag, Ihren Sproc auf solche syntaktischen Fehler zu überprüfen, die SQL möglicherweise ignoriert, aber der Grund für dieses Problem sein könnte. Vielen Dank.

0
Tapan