WCF与实体框架代码优先

时间:2014-07-13 12:14:55

标签: entity-framework wcf

我想在我的WCF服务后面使用EF来获取数据并将其显示给客户端。我需要以下建议:

  1. 我是否需要为所有视图(例如学生,教师等)提供相同的界面,或者我是否需要为每个表(或视图)提供不同的界面和服务

  2. 我是否需要在我的服务(.svc)中生成数据库调用,或者首选其他架构?

    public Student[] GetAllStudents()
    {
       //database generation code here
    }
    
  3. 如何使用EF代码优先方法生成数据库。我知道对于MVC应用程序,您需要在Global.asaxweb.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; }
    }
    

1 个答案:

答案 0 :(得分:0)

您真正应该做的是将您的系统分解为更多单独的层。而不是直接查询数据库的WCF调用,创建一个“商务逻辑”层,将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环境。