Je suis très nouveau dans Entity Framework 6 et je souhaite implémenter des procédures stockées dans mon projet. J'ai une procédure stockée comme suit:
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
classe:
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
}
Mon problème est: comment puis-je appeler la procédure stockée et y passer des paramètres?
Réponses:
Vous pouvez appeler une procédure stockée dans votre
DbContext
classe comme suit.Mais si votre procédure stockée renvoie plusieurs jeux de résultats comme exemple de code, vous pouvez voir cet article utile sur MSDN
Procédures stockées avec plusieurs jeux de résultats
la source
"storedProcedureName @param1, @param2"
. Le typeparams
est égalementSystem.Data.SqlClient.SqlParameter[]
.this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Il vous suffit de créer un objet qui a les mêmes noms de propriété que les résultats renvoyés par la procédure stockée. Pour la procédure stockée suivante:
créer une classe qui ressemble à:
puis appelez la procédure en procédant comme suit:
Le résultat contiendra une liste d'
ResultForCampaign
objets. Vous pouvez appeler enSqlQuery
utilisant autant de paramètres que nécessaire.la source
Je l'ai résolu avec
ExecuteSqlCommand
Mettez votre propre méthode comme la mienne dans DbContext comme vos propres instances:
vous pouvez donc avoir une méthode dans votre code-behind comme ceci:
c'est mon SP:
l'espoir vous a aidé
la source
En utilisant votre exemple, voici deux façons d'accomplir ceci:
1 - Utiliser le mappage de procédure stockée
Notez que ce code fonctionnera avec ou sans mappage. Si vous désactivez le mappage sur l'entité, EF générera une instruction insert + select.
2 - Appelez directement la procédure stockée
Je recommande d'utiliser la première approche, car vous pouvez travailler directement avec l'objet département et ne pas avoir à créer un groupe d'objets SqlParameter.
la source
Vous utilisez
MapToStoredProcedures()
ce qui indique que vous mappez vos entités aux procédures stockées, lorsque vous faites cela, vous devez laisser de côté le fait qu'il existe une procédure stockée et utiliser lacontext
comme d'habitude. Quelque chose comme ça ( écrit dans le navigateur, donc non testé )Si tout ce que vous essayez de faire est d'appeler directement une procédure stockée, utilisez
SqlQuery
la source
.MapToStoredProcedures(s =>
. Un appel àAdd
devrait résoudre.Insert(i => i.HasName("insert_department")
Vous pouvez maintenant également utiliser une convention que j'ai créée qui permet d'appeler des procédures stockées (y compris des procédures stockées renvoyant plusieurs jeux de résultats), des TVF et des FDU scalaires en mode natif depuis EF.
Lire la suite
Lisez plus .
la source
la source
Cela fonctionne pour moi en retirant les données d'une procédure stockée tout en passant un paramètre.
_db
est le dbContextla source
Jetez un œil à ce lien qui montre comment fonctionne le mappage d'EF 6 avec les procédures stockées pour effectuer une insertion, une mise à jour et une suppression: http://msdn.microsoft.com/en-us/data/dn468673
Une addition
Voici un excellent exemple pour appeler une procédure stockée à partir de Code First:
Disons que vous devez exécuter une procédure stockée avec un seul paramètre, et que la procédure stockée renvoie un ensemble de données qui correspondent aux états de l'entité, nous aurons donc ceci:
Disons maintenant que nous souhaitons exécuter une autre procédure stockée avec deux paramètres:
Notez que nous utilisons une dénomination basée sur un index pour les paramètres. En effet, Entity Framework encapsule ces paramètres sous forme d'objets DbParameter pour vous afin d'éviter tout problème d'injection SQL.
J'espère que cet exemple vous aidera!
la source
la source
Cela fonctionne pour moi au code d'abord. Il retourne une liste avec la propriété correspondante du modèle de vue (StudentChapterCompletionViewModel)
Mis à jour pour le contexte
Le contexte est l'instance de la classe qui hérite de DbContext comme ci-dessous.
la source
Mindless passager a un projet qui permet de renvoyer plusieurs ensembles de résultats à partir d'un processus stocké à l'aide du cadre d'entité. Un de ses exemples ci-dessous ....
la source
Vous pouvez passer des paramètres
sp_GetById
et récupérer les résultats dansToList()
ouFirstOrDefault();
la source
si vous voulez passer des paramètres de table dans une procédure stockée, vous devez définir la propriété TypeName pour vos paramètres de table.
la source
C'est ce que EF (DB en premier) génère dans la classe DbContext:
la source
Lorsque EDMX crée cette fois-ci si vous sélectionnez l'option de sélection de procédure stockée dans la table, puis appelez simplement la procédure de stockage en utilisant le nom de procédure ...
la source
J'ai trouvé que l'appel des procédures stockées dans l'approche Code First n'est pas pratique. Je préfère utiliser
Dapper
placeLe code suivant a été écrit avec
Entity Framework
:Le code suivant a été écrit avec
Dapper
:Je crois que le deuxième morceau de code est plus simple à comprendre.
la source
la source
Rien à faire ... lorsque vous créez dbcontext pour le code, approchez d'abord l'initialisation de l'espace de noms sous la zone API courante, faites la liste de sp et utilisez-la à un autre endroit où vous le souhaitez.
}
la source
Utilisation de MySql et du code cadre Entity first Approche:
la source
Créer une procédure dans MYsql.
Créer une classe qui contient des valeurs d'ensemble de résultats de retour de procédure stockée
Ajouter une classe dans Dbcontext
Appeler l'entité dans le référentiel
la source