【问题标题】:WCF with Entity Framework Code FirstWCF 与实体框架代码优先
【发布时间】:2014-07-14 00:32:36
【问题描述】:

我想在我的 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.不;你可以,确实让事情变得更干净; 2. 嗯,也许 OData 可以在这里提供帮助? 3. 听起来你可能会从教程文章中受益,而不是 SO

标签: entity-framework wcf


【解决方案1】:

您真正应该做的是将您的系统分解为更多独立的层。与其让 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 环境。

【讨论】:

  • 这是否意味着:1)首先创建一个基于 MVC 的解决方案,2)生成数据库,如果一切正常,3)在解决方案中添加一个 WCF 应用程序项目,4)调用基于 MVC DAL 层通过将其引用添加到 WCF 项目 5) 删除控制器和视图,因为它们不是必需的。请在需要的地方纠正我
  • 使用 3 个项目,1) 一个完全独立于使用它的 DAL dll。 2)一个“沙盒项目”来启动和运行,包括#1中的项目作为参考。这可能是一个控制台应用程序、一个 MVC Web 应用程序或任何东西,它只是临时充当你的脚手架,直到你用 EF 解决了你的问题。 3) 您的 WCF 项目也使用 #1 中的 DLL。
  • 谢谢@Scott Chamberlain 最后一个建议。 1) 我可以从我用于 WCF 服务的同一接口(即 ISchool)继承我的 DAL 吗? 2) 如果我必须在我的 WebService 中定义多个方法,比如 IStudent 的 Student 方法,ITeacher 的 Teacher 方法,该怎么办?提前致谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 2017-09-01
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多