2013-11-20 95 views
1

我想開始爲我的項目使用實體框架。我們即將開始的一個新項目將包含一個Employee表。我最初計劃擁有一個IEmployee接口,該接口將由一個Manager和Staff類實現,這將允許不同的功能,但都將數據存儲在Employee表中,表中的標誌區分它們。可以將我自己的類添加到實體框架嗎?

如果我使用數據庫首先,設計我的員工表,然後使用實體框架,我知道.tt文件將有一個部分類員工。然後,我可以創建自己的Manager和Staff類來實現部分類Employee。但是,那麼我將如何使用實體框架將其存儲在數據庫中?我可以做這樣的事情

// currentManager would be the manager object 
dbContext.Emplyee.Add(currentManager); 
dbContext.SaveChanges(); 

將實體框架是確定這一點,即使我傳遞一個Manager對象爲員工節省?還是有更好的方法來做到這一點?和檢索一樣,我如何使用實體框架找回經理或員工?我需要先得到一個員工,然後再施放嗎?類似於:

var employee = from employees... // get employee 
Manager currentManager = (Manager)employee; 

回答

2

是的,您可以首先使用EF DB,並具有存儲在同一數據庫表中的公共基類派生的多個類。

您設想的「旗幟」被EF稱爲辨別器。它是表格中的一列,指定記錄是哪個子類型的實例。

隨着數據庫第一,你需要調整由EF生成的模型來獲得這個工作,但它非常簡單。我想對此進行設置的最簡單方法是

  1. 創建SQL數據庫模型,爲確保該僱員表有NOT NULL屬性一樣EmployeeType,可作爲鑑別。我認爲這可以是任何類型,但一個int將工作正常。
  2. 創建您的EF模型(添加|新項目... |數據| ADO.NET實體數據模型),並映射Employee表(以及您需要的任何其他項)。
  3. 雙擊生成的.edmx文件打開實體框架設計器。
  4. 用鼠標右鍵單擊遊覽畫面並選擇添加新... |實體並創建一個Manager實體,該實體來自Employee。重複設置Staff.您的設計師應該看起來像這樣:Entities
  5. 右鍵單擊管理器並選擇表映射。在映射詳細信息中,指定它映射到Employee並添加條件當EmployeeType = 1時。爲員工做同樣的事情,但是當員工類型= 2時,製作映射screenshot of mapping details
  6. 最後,您需要刪除EmployeeType屬性從Employee映射。

也正在做,可以延長ManagerStaff類(即現在由EF生成的部分類)有你想要的任何業務邏輯,並通過Employees映射做EF查詢的/ etc:

public class Manager : Employee 
{ 
    public void customManagerMethod() { } 
} 

public class Staff : Employee 
{ 
    public void customStaffMethod() { } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var db = new dbfirstEntities()) 
     { 
      Manager m = new Manager 
      { 
       FirstName = "Joe", 
       LastName = "Bigshot" 
      }; 

      Staff s = new Staff 
      { 
       FirstName = "Joe", 
       LastName = "Schmoe" 
      }; 

      db.Employees.Add(m); 
      db.Employees.Add(s); 

      db.SaveChanges(); 
     } 
    } 
} 
相關問題