Comment utiliser une procédure stockée dans ADO.NET Entity Framework

.net c# entity-framework linq

Question

J'ai 3 tables; J'écris une procédure stockée dans 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

J'ai besoin d'une fonction de procédure stockée que j'écris ci-dessous:

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

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

Fonction GetPersonelInformationWithDepartmanID J'écris à partir de SQL (fonction définie par l'utilisateur dans ADO.NET Entity Framework). Comment puis-je utiliser si je joins 3 table avant?

Réponse acceptée

Ok, vous avez besoin de quelques étapes ici:

  • ajoutez votre procédure stockée sp_GetDepartmanData à votre modèle Entity Framework (en sp_(something) il est vivement recommandé de NE PAS appeler vos procédures stockées) sp_(something) - l'utilisation du préfixe sp_ est réservée aux procédures stockées système de Microsoft uniquement)
  • étant donné que votre procédure stockée renvoie un ensemble de données, vous devez d'abord créer une entité conceptuelle avant de pouvoir utiliser votre procédure stockée; Dans le concepteur d'entité, créez une nouvelle entité et appelez-la un nom utile comme DepartmentDataEntityType ou quelque chose de ce genre. ajouter tous les champs renvoyés par la procédure stockée à ce type d'entité
  • vous pouvez maintenant créer votre importation de fonction dans le modèle de données d'entité - accédez au navigateur de modèle, dans la section "model.store", accédez à votre procédure stockée, puis cliquez avec le bouton droit de la souris sur "créer une importation de fonction".
  • vous pouvez maintenant nommer votre fonction dans le contexte de l'objet et définir ce qu'elle retourne - dans ce cas, choisissez le type d'entité que vous venez de créer (par exemple, DepartmentDataEntityType ci-dessus).
  • vous avez terminé!

Vous devriez maintenant avoir une fonction importer quelque chose comme:

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);
}

Cette fonction sur votre contexte d'objet peut maintenant être appelée pour récupérer les données via la procédure stockée à partir de votre base de données.

Marc

Modifier:

Si vous obtenez une erreur de mappage ("Erreur 3027: aucun mappage spécifié pour les EntitySet / AssociationSet suivants"), cela est dû au fait que l'entité que vous avez créée n'est mappée à rien et n'est utilisée que lorsque la fonction d'importation remplit une collection. de ces entités. Vous devez mapper cette entité sur un magasin de données d'une manière ou d'une autre ou vous devez le changer en un type complexe.

Pour créer un type complexe, ouvrez simplement le concepteur EF et cliquez avec le bouton droit de la souris sur une zone vide. Allez dans Ajouter> Type de complexe. Vous devriez voir un nouveau type complexe apparaître dans le navigateur de modèle. Cliquez dessus avec le bouton droit de la souris et ajoutez des propriétés scalaires similaires à la façon dont vous avez ajouté des propriétés à votre entité. Supprimez ensuite votre entité et renommez votre type de complexe de la même manière que l'entité.

C'est tout ce que tu as à faire :)


Réponse populaire

Comment créez-vous cette "entité conceptuelle"? Si je crée une entité qui n'est pas mappée à la, j'obtiens l'erreur suivante: "Le type d'entité 'foobar' n'est pas mappé à la base de données.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow