2014-07-13 2 views
3

Я хочу использовать EF за моей службой WCF для извлечения данных и отображения их клиенту. Мне нужны следующие предложения:WCF с Entity Framework Code First

  1. мне нужно иметь один и тот же интерфейс для всех представлений (например, студентов, учителей и т.д.) делают или мне нужно иметь другой интерфейс и сервис для каждой таблицы (или представление)

  2. Нужно ли мне генерировать вызовы базы данных в моей службе (.svc) или какая-либо другая архитектура?

    public Student[] GetAllStudents() 
    { 
        //database generation code here 
    } 
    
  3. Как я могу использовать первый подход EF кодов для создания базы данных. Я знаю, что для приложения MVC вам нужно установить инициализатор в Global.asax или в web.config, но я не уверен, как он вызывается в этом случае. Моя модель выглядит следующим образом:

    [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. Нет; вы можете сделать вещи чище; 2. Может быть, OData может помочь здесь? 3. Похоже, вы могли бы извлечь выгоду из учебной статьи, а не из-за чего-либо на SO – MickyD

ответ

0

Что вам действительно нужно сделать, это разбить систему на несколько отдельных слоев. Вместо того, чтобы иметь вызов WCF, который напрямую запрашивает базу данных, создайте слой логики «buisness», который преобразует информацию, которую вызов WCF предоставляет вам тем, что должен знать EF-вызов. Это называется 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(); 
     } 
    } 
} 

Вызывающим вызова WCF не нужно знать, что строка ScienceStudentType есть, все это заботится о том, что он получает студент науки. Отделив бизнес-логику от вызова базы данных, вызывающему абоненту вашего сервиса больше не нужно знать.

Для EF он будет инициализирован в первый раз, когда структура отключится, чтобы «коснуться» базы данных и обнаружила, что ее нет, если она настроена для этого. Это делается в конструкторе SchoolContext, но для этого ответа он слишком широк. Я рекомендую найти учебник по EF и заставить его работать в простой тестовой среде без WCF (возможно, простое консольное приложение, которое просто вызывает GetStudents(), затем перейдите в среду WCF.

+0

Это означает: 1) сначала создать решение на основе MVC, 2) создать базу данных, и если все будет хорошо работать, 3) добавьте приложение WCF проект в решении, 4) Вызвать уровень DAL на основе MVC, добавив его ссылку на проект WCF 5) Удалите контроллеры и представления, поскольку они не требуются. Пожалуйста, исправьте меня, если необходимо – newbie

+0

Используйте 3 проекта, 1) DAL dll, которая полностью независима от того, что ее использует. 2) Проект «песочницы» для его запуска и запуска, в том числе проект из № 1 как подтверждение. Это может быть консольное приложение, веб-приложение MVC или что-то еще, только временно действовать как ваши леса, пока вы не получите свои изломы, разработанные с помощью EF. 3) Проект WCF, который также использует DLL из # 1. –

+0

Спасибо @Scott Chamberlain Последний совет. 1) Могу ли я наследовать свой DAL из того же интерфейса, то есть ISchool, который я использую для своей службы WCF? 2) Что делать, если мне нужно определить несколько методов в моем WebService, например, методы Студента из IStudent, методы Учителя из ITeacher? Спасибо заранее. – newbie

Смежные вопросы