So verwenden Sie eine gespeicherte Prozedur in ADO.NET Entity Framework

.net c# entity-framework linq

Frage

Ich habe 3 tische; Ich schreibe eine gespeicherte Prozedur in ADO.NET Entity Framework.

ALTER PROCEDURE [dbo].[sp_GetDepartmanData]
(@departman nvarchar(50))
BEGIN
  SELECT  
    d.ID, d.Name as DepartmanName,  
    sb.Salary, sb.email,
    sp.Name, sp.SurName, sp.Phone, sp.Married, sp.Address
  FROM         
    Departman d 
  INNER JOIN StaffsBusiness sb ON d.ID = sb.StaffsPersonelDepartmanID
  INNER JOIN StaffsPersonel sp ON sb.StaffsPersonelID = sp.ID 
  WHERE
    d.Name = @departman
END

Ich brauche eine Funktion für gespeicherte Prozeduren, die ich unten schreibe:

var staffPersonel = staffContext.GetPersonelInformationWithDepartmanID("Yazılım");

gvPersonel.DataSource = staffPersonel;
gvPersonel.DataBind();

GetPersonelInformationWithDepartmanID-Funktion Ich schreibe aus SQL (benutzerdefinierte Funktion in ADO.NET Entity Framework). Es gibt 3 Alternativen (es ist dumm !!!), aber ich habe 3 Joining-Tabelle !!! Wie kann ich es verwenden, wenn ich zuvor 3 Tische verbinde?

Akzeptierte Antwort

Okay, du brauchst ein paar Schritte hier:

  • sp_GetDepartmanData Sie Ihre gespeicherte Prozedur sp_GetDepartmanData zu Ihrem Entity Framework-Modell hinzu ( sp_GetDepartmanData - es wird dringend empfohlen, Ihre gespeicherten Prozeduren NICHT sp_(something) sp_ Verwendung des sp_ Präfix ist nur für gespeicherte Microsoft-Prozeduren vorbehalten.
  • Da Ihre gespeicherte Prozedur einen Datensatz zurückgibt, müssen Sie zunächst eine konzeptionelle Entität dafür erstellen, bevor Sie die gespeicherte Prozedur verwenden können. Erstellen Sie im Entity Designer eine neue Entität, und nennen Sie sie einen nützlichen Namen wie DepartmentDataEntityType oder so. Fügen Sie alle von der gespeicherten Prozedur zurückgegebenen Felder zu diesem Entitätstyp hinzu
  • Sie können jetzt Ihren Funktionsimport im Entity-Datenmodell erstellen. Gehen Sie zum Modellbrowser. Gehen Sie im Abschnitt "model.store" zu Ihrer gespeicherten Prozedur und klicken Sie mit der rechten Maustaste auf "Funktionsimport erstellen".
  • Sie können Ihrer Funktion nun einen Namen im Objektkontext geben und definieren, was sie zurückgibt. Wählen Sie in diesem Fall den neu erstellten Entitätstyp (z. B. DepartmentDataEntityType von oben).
  • Sie sind fertig!

Sie sollten jetzt eine Funktion importieren, etwa wie:

public global::System.Data.Objects.ObjectResult<DepartmentDataEntityType> GetPersonelInformationWithDepartmanID(global::System.String departmentName)
{
    global::System.Data.Objects.ObjectParameter departmentNameParameter;

    departmentNameParameter = new global::System.Data.Objects.ObjectParameter("departmentNameParameter", departmentName);

    return base.ExecuteFunction<DepartmentDataEntityType>("sp_GetDepartmanData", departmentNameParameter);
}

Diese Funktion in Ihrem Objektkontext kann jetzt aufgerufen werden, um die Daten über die gespeicherte Prozedur aus Ihrer Datenbank abzurufen.

Marc

Bearbeiten:

Wenn Sie danach einen Zuordnungsfehler erhalten ("Fehler 3027: Keine Zuordnung für das folgende EntitySet / AssociationSet angegeben"), liegt dies daran, dass die von Ihnen erstellte Entität keinem Objekt zugeordnet ist und nur verwendet wird, wenn der Import einer Funktion eine Auflistung auffüllt dieser Entitäten. Sie müssen diese Entität entweder irgendwie einem Datenspeicher zuordnen oder in einen komplexen Typ ändern.

Um einen komplexen Typ zu erstellen, öffnen Sie einfach den EF-Designer und klicken Sie mit der rechten Maustaste auf einen leeren Bereich. Gehen Sie zu Hinzufügen> Komplexer Typ. Es sollte ein neuer komplexer Typ im Modellbrowser angezeigt werden. Klicken Sie mit der rechten Maustaste darauf und fügen Sie skalare Eigenschaften hinzu, ähnlich wie Sie Ihrer Entität Eigenschaften hinzugefügt haben. Löschen Sie anschließend Ihre Entität und benennen Sie Ihren komplexen Typ genauso wie die Entität um.

Das ist alles was du tun musst :)


Beliebte Antwort

Wie schaffen Sie diese "konzeptuelle Entität"? Wenn ich eine Entität erzeuge, die nicht dem zugeordnet ist, erhalte ich folgende Fehlermeldung: "Entitätstyp 'foobar' wird nicht der Datenbank zugeordnet.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum