Jestem bardzo nowy w Entity Framework 6 i chcę wdrożyć procedury składowane w moim projekcie. Mam procedurę składowaną w następujący sposób:
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
klasa:
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
}
Mój problem brzmi: jak mogę wywołać procedurę składowaną i przekazać do niej parametry?
Odpowiedzi:
Możesz wywołać procedurę przechowywaną w swojej
DbContext
klasie w następujący sposób.Ale jeśli procedura składowana zwraca wiele zestawów wyników jako przykładowy kod, możesz zobaczyć ten pomocny artykuł na MSDN
Procedury przechowywane z wieloma zestawami wyników
źródło
"storedProcedureName @param1, @param2"
. Również typparams
jestSystem.Data.SqlClient.SqlParameter[]
.this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Wszystko, co musisz zrobić, to utworzyć obiekt, który ma takie same nazwy właściwości jak wyniki zwrócone przez procedurę przechowywaną. Dla następującej procedury składowanej:
utwórz klasę, która wygląda następująco:
a następnie wywołaj procedurę, wykonując następujące czynności:
Wynik będzie zawierał listę
ResultForCampaign
obiektów. Możesz zadzwonić,SqlQuery
używając dowolnej liczby parametrów.źródło
Rozwiązałem to za pomocą
ExecuteSqlCommand
Umieść własną metodę, taką jak moja, w DbContext jako własne wystąpienia:
więc możesz mieć w swoim kodzie taką metodę:
to jest mój SP:
nadzieja ci pomogła
źródło
Korzystając z Twojego przykładu, oto dwa sposoby na osiągnięcie tego:
1 - Użyj mapowania procedur składowanych
Pamiętaj, że ten kod będzie działał z mapowaniem lub bez. Jeśli wyłączysz mapowanie na encji, EF wygeneruje instrukcję insert + select.
2 - Wywołaj procedurę przechowywaną bezpośrednio
Zalecam zastosowanie pierwszego podejścia, ponieważ można bezpośrednio pracować z obiektem departamentu i nie trzeba tworzyć wiązki obiektów SqlParameter.
źródło
Używasz,
MapToStoredProcedures()
co wskazuje, że mapujesz swoje byty na procedury składowane, robiąc to, musisz uwolnić się od faktu, że istnieje procedura składowana i użyć jejcontext
jak zwykle. Coś takiego ( zapisane w przeglądarce, więc nie przetestowane )Jeśli wszystko, co naprawdę próbujesz zrobić, to bezpośrednio wywołać procedurę składowaną, użyj
SqlQuery
źródło
.MapToStoredProcedures(s =>
. Wezwanie doAdd
powinno zostać rozwiązane.Insert(i => i.HasName("insert_department")
Możesz teraz także użyć utworzonej przeze mnie konwencji, która umożliwia wywoływanie procedur przechowywanych (w tym procedur zwracających wiele zestawów wyników), TVF i skalarnych UDF natywnie z EF.
Czytaj więcej
Czytaj dalej .
źródło
źródło
Działa to dla mnie, wyciągając dane z procedury składowanej podczas przekazywania parametru.
_db
to dbContextźródło
Spójrz na ten link, który pokazuje, jak działa mapowanie EF 6 z procedurami przechowywanymi, aby wstawić, zaktualizować i usunąć: http://msdn.microsoft.com/en-us/data/dn468673
Dodanie
Oto świetny przykład wywołania procedury składowanej z Code First:
Powiedzmy, że musisz wykonać procedurę składowaną z jednym parametrem, a procedura składowana zwraca zestaw danych pasujących do stanów encji, więc otrzymamy:
Powiedzmy teraz, że chcemy wykonać inną procedurę składowaną z dwoma parametrami:
Zauważ, że używamy nazewnictwa opartego na indeksie dla parametrów. Wynika to z faktu, że Entity Framework zawinie te parametry jako obiekty DbParameter, aby uniknąć problemów z wstrzykiwaniem SQL.
Mam nadzieję, że ten przykład pomoże!
źródło
źródło
Najpierw działa dla mnie w kodzie. Zwraca listę z pasującą właściwością modelu widoku (StudentChapterCompletionViewModel)
Zaktualizowano dla kontekstu
Kontekst jest instancją klasy, która dziedziczy DbContext jak poniżej.
źródło
Bezmyślny pasażer ma projekt, który umożliwia zwrócenie wielu zestawów wyników z przechowywanego proc przy użyciu frameworku encji. Jeden z jego przykładów poniżej ....
źródło
Możesz przekazać parametry
sp_GetById
i pobrać wyniki wToList()
lubFirstOrDefault();
źródło
jeśli chcesz przekazać parametry tabeli do procedury składowanej, musisz ustawić właściwość TypeName dla swoich parametrów tabeli.
źródło
Oto, co EF (najpierw DB) generuje w klasie DbContext:
źródło
Kiedy EDMX utworzy ten czas, jeśli wybierzesz opcję przechowywaną w procedurze wyboru tabeli, to po prostu zadzwoń do sklepu przetworzonego przy użyciu nazwy procedury ...
źródło
Odkryłem, że wywoływanie procedur przechowywanych w podejściu Code First nie jest wygodne. Wolę używać
Dapper
zamiast tegoPoniższy kod został napisany za pomocą
Entity Framework
:Poniższy kod został napisany za pomocą
Dapper
:Uważam, że drugi fragment kodu jest łatwiejszy do zrozumienia.
źródło
źródło
Nic nie trzeba robić ... podczas tworzenia kontekstu db dla kodu pierwsze podejście zainicjuj przestrzeń nazw poniżej obszaru płynnego interfejsu API stwórz listę sp i użyj jej w innym miejscu, w którym chcesz.
}
źródło
Pierwsze użycie kodu frameworku MySql i Entity Podejście:
źródło
Utwórz procedurę w MYsql.
Utwórz klasę zawierającą procedury składowane zwracające wartości zestawu wyników
Dodaj klasę w Dbcontext
Wywołaj encję w repozytorium
źródło