2014-07-13 62 views
3

我想在我的WCF服務後面使用EF來提取數據並將其顯示給客戶端。我需要以下建議:WCF with Entity Framework代碼優先

  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; } 
    } 
    
+0

1.否;你可以,讓事情變得更清潔;嗯,也許OData可能有幫助嗎? 3.聽起來像是你可能會從一個教程文章,而不是SO – MickyD

回答

0

你真正應該做的是在更獨立的層打破了你的系統。而不是直接查詢數據庫的WCF調用,而是創建一個「buisness邏輯」層,將WCF調用爲您提供的信息轉換爲EF調用需要知道的信息。這就是所謂的WCF調用的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(); 
     } 
    } 
} 

的調用者不需要知道字符串ScienceStudentType,所有它關心的是它獲得了理科生。通過從數據庫中分離業務邏輯,調用服務的調用者不再需要知道。

對於EF它將初始化就第一時間框架出去「摸」的數據庫,並檢測到它是不存在的,如果它被設置這樣做。這是在SchoolContext的構造函數中完成的,但對於這個答案有點過於寬泛。我建議在EF上找到一個教程,並讓它在沒有WCF的簡單測試環境中工作(也許是一個簡單的控制檯應用程序,只需調用GetStudents(),然後移入到WCF環境中。

+0

一些受益這是否意味着:1)首先創建一個基於MVC解決方案, 2)生成數據庫,如果一切運作良好, 3)添加一個WCF應用項目, 4)通過添加對WCF項目的引用來調用基於MVC的DAL層 5)刪除控制器和視圖,因爲它們不是必需的。 請在需要時糾正我 – newbie

+0

使用3個項目,1)完全獨立於使用它的DAL dll。 2)一個「沙盒項目」來啓動並運行,包括來自#1的項目作爲參考。這可能是一個控制檯應用程序,一個MVC的網絡應用程序,或任何東西,它只是暫時的作爲你的腳手架,直到你得到你與EF的糾結。 3)您的WCF項目也使用來自#1的DLL。 –

+0

謝謝@Scott Chamberlain 最後一條建議。 1)我可以從我用於WCF服務的相同界面繼承我的DAL,即ISchool嗎? 2)如果我必須在WebService中定義多個方法,例如來自IStudent的學生方法,來自ITeacher的教師方法,該怎麼辦? 在此先感謝。 – newbie

相關問題