2014-07-13 3 views
3

Je veux utiliser EF derrière mon service WCF pour récupérer les données et les afficher au client. J'ai besoin des suggestions suivantes:WCF avec Entity Framework Code Premier

  1. Ai-je besoin d'avoir la même interface pour tous les points de vue (par exemple les étudiants, les enseignants, etc.) ou dois-je besoin d'avoir une interface différente et de service pour chaque table (ou vue Ai-je besoin de générer les appels de base de données au sein de mon service (.svc) ou d'autres architectures sont-elles préférables?

  2. public Student[] GetAllStudents() 
    { 
        //database generation code here 
    } 
    
  3. Comment puis-je utiliser le code-première approche EF pour générer la base de données. Je sais que pour une application MVC, vous devez définir l'initialiseur dans Global.asax ou web.config mais je ne suis pas sûr comment il s'appelle dans ce cas. Mon modèle ressemble à ceci:

    [DataContract] 
    public class Student 
    { 
        [DataMember] 
        [Key] 
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
        public int Id { get; set; } 
        [DataMember] 
        public string Type { get; set; } 
        [DataMember] 
        public string Subject { get; set; } 
        [DataMember] 
        public string Description { get; set; } 
    } 
    
+0

1. Non; vous pouvez, rend les choses plus propres; 2. Hmm peut-être que OData peut aider ici? 3. On dirait que vous pourriez bénéficier d'un article tutoriel plutôt que quelque chose sur SO – MickyD

Répondre

0

Ce que vous devez vraiment faire est de briser votre système pour des couches plus séparées. Au lieu d'avoir un appel WCF qui interroge directement la base de données, créez une couche «logique d'entreprise» qui traduit les informations que l'appel WCF vous fournit à ce que l'appel EF doit savoir. On appelle cela un N-Tier application

public class SchoolAPI : ISchoolAPI 
{ 
    private DataAccessLayer _dal = new DataAccessLayer(); 

    public Student[] GetAllStudents() 
    { 
     return _dal.GetStudents(null, null); 
    } 

    public Student[] GetAllScienceStudents() 
    { 
     return _dal.GetStudents(null, DataAccessLayer.ScienceStudentType); 
    } 
} 

private class DataAccessLayer 
{ 
    public static readonly ScienceStudentType = //... 

    public Student[] GetStudents(string subject, string type) 
    { 
     using(var ctx = new SchoolContext()) 
     { 
      IQueryable<Student> studentQuery = ctx.Students; 

      if(subject != null) 
       studentQuery = studentQuery.Where(s=>s.Subject == subject); 

      if(type != null) 
       studentQuery = studentQuery.Where(s=>s.Type == type); 

      return studentQuery.ToArray(); 
     } 
    } 
} 

L'appelant de l'appel WCF n'a pas besoin de savoir ce que la chaîne ScienceStudentType est, tout ce qu'il prend soin est sur le point qu'il obtient les étudiants en sciences. En séparant la logique métier de l'appel de la base de données, l'appelant de votre service n'a plus besoin de savoir. Pour EF, il s'initialise la première fois que l'infrastructure sort pour "toucher" la base de données et détecte qu'elle n'est pas là si elle est configurée pour le faire. Ceci est fait dans le constructeur de SchoolContext mais devient un peu trop large pour cette réponse. Je recommande de trouver un tutoriel sur EF et de le faire fonctionner dans un environnement de test simple sans WCF (peut-être une simple application de console qui appelle simplement GetStudents() puis de passer dans un environnement WCF.

+0

Est-ce que cela signifie: 1) pour créer une solution basée MVC d'abord, 2) générer la base de données et si tout fonctionne bien, 3) ajouter une application WCF projet dans la solution, 4) Appelez la couche DAL basée sur MVC en ajoutant sa référence au projet WCF 5) Supprimez les contrôleurs et les vues car ils ne sont pas requis. S'il vous plaît corrigez-moi si nécessaire – newbie

+0

Utilisez 3 projets, 1) Une DLL DAL qui est totalement indépendant de ce qui l'utilise. 2) Un "projet de bac à sable" pour le faire fonctionner, y compris le projet de # 1 en tant que réfrence. Cela peut être une application de console, une application Web MVC, ou quoi que ce soit, il est seulement temporaire d'agir comme votre échafaudage jusqu'à ce que vous obtenez vos kinks élaborés avec EF. 3) Votre projet WCF qui utilise également la DLL de # 1. –

+0

Merci @Scott Chamberlain Un dernier conseil. 1) Puis-je hériter de mon DAL à partir de la même interface, c'est-à-dire ISchool que j'utilise pour mon service WCF? 2) Et si je dois définir plusieurs méthodes dans mon WebService, comme les méthodes de Student de IStudent, les méthodes de Teacher de ITeacher? Merci d'avance. – newbie

Questions connexes