2009-06-21 8 views
6

J'ai 3 tables; J'écris une procédure stockée dans ADO.NET Entity Framework.Comment utiliser 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 j'écris ci-dessous:

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

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

fonction GetPersonelInformationWithDepartmanID Je vous écris de SQL (fonction définie par l'utilisateur dans ADO.NET Entity Framework) il y a 3 alternatives (il c'est idiot !!!) mais j'ai 3 table joininig !!! Comment puis-je utiliser si je rejoins 3 table avant?

Répondre

6

D'accord, vous avez besoin de quelques étapes ici:

  • ajoutez votre procédure stockée sp_GetDepartmanData à votre modèle Entity Framework (en aparté - c'est est fortement recommandons PAS pour 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 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 n utilisez votre proc stocké; dans le Concepteur d'entités, créez une nouvelle entité et appelez-le comme un nom utile comme DepartmentDataEntityType ou quelque chose; Maintenant, vous pouvez créer votre fonction d'importation dans le modèle de données d'entité - allez dans le navigateur de modèle, dans la section "model.store" allez à votre procédure stockée , et faites un clic droit sur "créer une fonction import"
  • vous pouvez maintenant donner un nom à votre fonction dans le contexte de l'objet et définir ce qu'elle renvoie - dans ce cas, choisissez votre type d'entité nouvellement créé (par exemple DepartmentDataEntityType)
  • vous avez terminé!

Vous devriez maintenant avoir un quelque chose comme l'importation de fonction:

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 de votre contexte d'objet peut maintenant être appeler pour récupérer les données via la procédure stockée à partir de votre base de données.

Marc

Edit:

Si vous obtenez une erreur de cartographie ("Erreur 3027: Le mappage spécifié pour ce qui suit EntitySet/AssociationSet") après avoir fait cela, il est parce que l'entité créée n'est mappé à rien et n'est utilisé que lorsque la fonction import remplit une collection de ces entités. Vous devez soit mapper cette entité à un magasin de données, soit vous devez le modifier en un type complexe.

Pour créer un type complexe, ouvrez simplement le concepteur EF et faites un clic droit sur une zone vide. Allez à Ajouter> Type complexe. Vous devriez voir apparaître un nouveau type complexe dans le navigateur du modèle. Faites un clic droit dessus 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 complexe de la même manière que l'entité.

C'est tout ce que vous avez à faire :)

+0

Salut Marc.. J'ai essayé de suivre vos instructions, ici ... et je ne peux pas le faire fonctionner quand j'ai une configuration POCO Si je permets au concepteur de créer mes cours, alors cela fonctionne. Savez-vous comment faire avec POCO'S? –

+0

@ Pure.Krome: non, désolé, je n'ai pas vraiment fait quelque chose avec EF4 POCO, donc je ne peux pas vraiment dire .... –

+0

Cela fonctionne, mais je reçois une erreur persistante dans la liste des erreurs qui s ays "Erreur 3027: aucun mappage spécifié pour l'EntitySet/AssociationSet suivant". Que dois-je faire pour résoudre cette erreur? – Chev

1

Comment créer cette « entité conceptuelle »? Si je crée une entité qui n'est pas mis en correspondance au-je obtenir l'erreur suivante: « Type d'entité « foobar » est pas mis en correspondance avec la base de données

+0

Je reçois cette erreur aussi ... d'après ce que je peux dire, c'est un bug 1.0 qu'ils n'ont pas l'intention de corriger avant la sortie de 4.0 en mars. https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=378518&wa=wsignin1.0 –

+0

Bummer :(J'utilise VS2010 et j'ai toujours ce problème .. même si MS Connect dit le bug est 'corrigé' WTF :(qq :( –

Questions connexes