2012-05-09 70 views
2

我剛剛開始與實體框架,我似乎是誤解的東西。基本上我已經有一個數據庫已經安裝。假設以下是我的表格。EF代碼第一多表到單個實體

**Employees** 
EmployeeId 
CubeId (FK to Cubes table) 
NameId (FK to Name table) 

**Cubes** 
CubeId 
CubeName 

**Person** 
NameId 
FirstName 
LastName 

我想寫這樣的東西:SELECT EmployeeId, CubeId, CubeName, FirstName, LastName FROM Employees LEFT OUTER JOIN Cubes LEFT OUTER JOIN Person。所以它會返回所有員工。基本上,在EF Code First中,你是否必須爲每個表創建一個類?如果不是,你如何創建一個左外部連接等效?我發現的所有例子都使用導航屬性從一個表格到另一個表格(即從類到類)。

回答

3

型號:

public class Employee 
{ 
    [Key] 
    public int EmployeeId {get;set;} 
    public int CubeId {get;set;} 
    [ForeignKey("Cube")] 
    public int NameId {get;set;} 
    [ForeignKey("Name")] 

    public virtual Cube Cube {get;set;} 
    public virtual Name Name {get;set;} 
} 

public class Cube 
{ 
    [Key] 
    public int CubeId {get;set;} 
    public string CubeName {get;set;} 
} 

public class Name 
{ 
    [Key] 
    public int NameId {get;set} 

    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

你的背景:

public class YourContext:DbContext 
{ 
    public DbSet<Name> Names {get;set;} 
    public DbSet<Cube> Cubes {get;set;} 
    public DbSet<Employee> Employees {get;set;} 
} 

您的疑問:

YourContext db = new YourContext(); 
var query = db.Employees.Where(x => x.EmployeeId == id).Select(x => new 
{ 
    EmployeeId = x.EmployeeId, 
    CubeId = x.Cube.CubeId, 
    CubeName = x.Cube.CubeName, 
    FirstName = x.Name.FirstName, 
    LastName = x.Name.LastName 
}).FirstOrDefault(); 

這將找到具有一定的ID的第一個員工(或者返回空,如果有沒有) ,然後創建一個包含您提到的所有屬性的類型。如果您需要姓氏,您可以通過以下方式訪問:

string lastName = query.LastName;

+0

所以你說你需要爲每一張桌子做一個模型呢?如果是這樣的話,對於已經存在的數據庫使用Code First有什麼意義?您可以使用元數據提取。 – Dan

+0

名稱「Code First」說明了一切。目標是提供手段來首先編寫代碼,代碼將構建數據庫。如果您已經擁有數據庫,那麼將您的數據庫添加到解決方案中,並使用一些TT生成POCO類(您可以使用NuGet獲取它)。 Code First爲您提供了在代碼內更改數據庫的優勢,如果這種更改不會損害您的數據。 –

+0

如果您下載實體框架電源工具,您還可以通過在Visual Studio中右鍵單擊來反向工程代碼。 –