Ich bin sehr neu in Entity Framework 6 und möchte gespeicherte Prozeduren in meinem Projekt implementieren. Ich habe eine gespeicherte Prozedur wie folgt:
ALTER PROCEDURE [dbo].[insert_department]
@Name [varchar](100)
AS
BEGIN
INSERT [dbo].[Departments]([Name])
VALUES (@Name)
DECLARE @DeptId int
SELECT @DeptId = [DeptId]
FROM [dbo].[Departments]
WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()
SELECT t0.[DeptId]
FROM [dbo].[Departments] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END
Department
Klasse:
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
}
modelBuilder
.Entity<Department>()
.MapToStoredProcedures(s =>
s.Update(u => u.HasName("modify_department")
.Parameter(b => b.Department, "department_id")
.Parameter(b => b.Name, "department_name"))
.Delete(d => d.HasName("delete_department")
.Parameter(b => b.DepartmentId, "department_id"))
.Insert(i => i.HasName("insert_department")
.Parameter(b => b.Name, "department_name")));
protected void btnSave_Click(object sender, EventArgs e)
{
string department = txtDepartment.text.trim();
// here I want to call the stored procedure to insert values
}
Mein Problem ist: Wie kann ich die gespeicherte Prozedur aufrufen und Parameter übergeben?
Antworten:
Sie können eine gespeicherte Prozedur in Ihrer
DbContext
Klasse wie folgt aufrufen .Wenn Ihre gespeicherte Prozedur jedoch mehrere Ergebnismengen als Beispielcode zurückgibt, wird dieser hilfreiche Artikel zu MSDN angezeigt
Gespeicherte Prozeduren mit mehreren Ergebnismengen
quelle
"storedProcedureName @param1, @param2"
. Auch die Art vonparams
istSystem.Data.SqlClient.SqlParameter[]
.this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Sie müssen lediglich ein Objekt erstellen, das dieselben Eigenschaftsnamen wie die von der gespeicherten Prozedur zurückgegebenen Ergebnisse hat. Für die folgende gespeicherte Prozedur:
Erstellen Sie eine Klasse, die wie folgt aussieht:
Rufen Sie dann die Prozedur wie folgt auf:
Das Ergebnis enthält eine Liste von
ResultForCampaign
Objekten. Sie könnenSqlQuery
mit so vielen Parametern wie nötig aufrufen .quelle
Ich habe es mit gelöst
ExecuteSqlCommand
Fügen Sie Ihre eigene Methode wie meine in DbContext als Ihre eigenen Instanzen ein:
So können Sie eine Methode in Ihrem Code-Behind wie folgt haben:
das ist mein SP:
Hoffnung hat dir geholfen
quelle
Anhand Ihres Beispiels haben Sie zwei Möglichkeiten, dies zu erreichen:
1 - Verwenden Sie die Zuordnung gespeicherter Prozeduren
Beachten Sie, dass dieser Code mit oder ohne Zuordnung funktioniert. Wenn Sie die Zuordnung für die Entität deaktivieren, generiert EF eine Anweisung insert + select.
2 - Rufen Sie die gespeicherte Prozedur direkt auf
Ich empfehle den ersten Ansatz, da Sie direkt mit dem Abteilungsobjekt arbeiten können und keine Reihe von SqlParameter-Objekten erstellen müssen.
quelle
Sie verwenden,
MapToStoredProcedures()
was darauf hinweist, dass Sie Ihre Entitäten gespeicherten Prozeduren zuordnen. Dabei müssen Sie die Tatsache loslassen, dass eine gespeicherte Prozedur vorhanden ist, und diecontext
wie gewohnt verwenden. So etwas ( in den Browser geschrieben, also nicht getestet )Wenn Sie wirklich nur versuchen, eine gespeicherte Prozedur direkt aufzurufen, verwenden Sie
SqlQuery
quelle
.MapToStoredProcedures(s =>
. Ein Anruf zuAdd
sollte sich auf.Insert(i => i.HasName("insert_department")
Sie können jetzt auch eine von mir erstellte Konvention verwenden, mit der gespeicherte Prozeduren (einschließlich gespeicherter Prozeduren, die mehrere Ergebnismengen zurückgeben), TVFs und skalare UDFs nativ von EF aufgerufen werden können.
Weiterlesen
Lesen Sie mehr .
quelle
quelle
Dies funktioniert bei mir, indem Daten aus einer gespeicherten Prozedur zurückgezogen werden, während ein Parameter übergeben wird.
_db
ist der dbContextquelle
Schauen Sie sich diesen Link an, der zeigt, wie die Zuordnung von EF 6 mit gespeicherten Prozeduren zum Einfügen, Aktualisieren und Löschen funktioniert: http://msdn.microsoft.com/en-us/data/dn468673
Zusatz
Hier ist ein gutes Beispiel, um eine gespeicherte Prozedur von Code First aus aufzurufen:
Nehmen wir an, Sie müssen eine gespeicherte Prozedur mit einem einzelnen Parameter ausführen, und diese gespeicherte Prozedur gibt einen Datensatz zurück, der mit den Entitätszuständen übereinstimmt. Wir haben also Folgendes:
Nehmen wir nun an, wir möchten eine andere gespeicherte Prozedur mit zwei Parametern ausführen:
Beachten Sie, dass wir für Parameter eine indexbasierte Benennung verwenden. Dies liegt daran, dass Entity Framework diese Parameter als DbParameter-Objekte für Sie zusammenfasst, um SQL-Injection-Probleme zu vermeiden.
Hoffe dieses Beispiel hilft!
quelle
quelle
Es funktioniert für mich zuerst im Code. Es wird eine Liste mit der übereinstimmenden Eigenschaft des Ansichtsmodells zurückgegeben (StudentChapterCompletionViewModel).
Für den Kontext aktualisiert
Context ist die Instanz der Klasse, die DbContext wie unten erbt.
quelle
Mindless Passenger hat ein Projekt, mit dem mehrere Ergebnismengen von einem gespeicherten Prozess mithilfe des Entity Frameworks zurückgegeben werden können. Eines seiner Beispiele unten ....
quelle
Sie können Parameter an oder übergeben
sp_GetById
und die Ergebnisse entweder inToList()
oder abrufenFirstOrDefault();
quelle
Wenn Sie Tabellenparameter an gespeicherte Prozeduren übergeben möchten, müssen Sie die TypeName-Eigenschaft für Ihre Tabellenparameter festlegen.
quelle
Folgendes generiert EF (DB zuerst) in der DbContext-Klasse:
quelle
Wenn EDMX dieses Mal erstellt, wenn Sie die Option zum Speichern der in der Tabelle gespeicherten Prozedur auswählen, rufen Sie einfach die Prozedur zum Speichern der Prozedur mit dem Namen der Prozedur auf ...
quelle
Ich fand, dass das Aufrufen gespeicherter Prozeduren im Code First-Ansatz nicht bequem ist. Ich bevorzuge es
Dapper
stattdessen zu verwendenDer folgende Code wurde geschrieben mit
Entity Framework
:Der folgende Code wurde geschrieben mit
Dapper
:Ich glaube, der zweite Code ist einfacher zu verstehen.
quelle
quelle
Nichts muss zu tun sein ... Wenn Sie dbcontext für Code erstellen, initialisieren Sie zuerst den Namespace unterhalb des fließenden API-Bereichs, erstellen Sie eine Liste von sp und verwenden Sie ihn an einer anderen Stelle, an der Sie möchten.
}}
quelle
Zuerst MySQL- und Entity-Framework-Code verwenden Ansatz:
quelle
Prozedur in MYsql erstellen.
Erstellen Sie eine Klasse, die gespeicherte Prozeduren enthält, die Ergebnismengenwerte zurückgeben
Klasse in Dbcontext hinzufügen
Rufen Sie die Entität im Repository auf
quelle