我想在我的WCF服务后面使用EF来获取数据并将其显示给客户端。我需要以下建议:
我是否需要为所有视图(例如学生,教师等)提供相同的界面,或者我是否需要为每个表(或视图)提供不同的界面和服务
我是否需要在我的服务(.svc
)中生成数据库调用,或者首选其他架构?
public Student[] GetAllStudents()
{
//database generation code here
}
如何使用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 :(得分: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环境。