2012-02-17 52 views
2

我創建一個數據庫首先使用實體​​框架代碼,我有一些問題與數據庫/ POCO設計。我的問題是繼承。代碼第一POCO設計

我的系統有兩個主要的用戶角色講師和學生。我有一個基本的用戶類,其中包含身份證,登錄,角色(確定他們是講師還是學生),名字和姓氏。如果用戶是講師,那麼他們也有與他們相關的標籤屬性(關係)。如果用戶是學生,那麼他們有一年和學位類型的財產。

這兩種類型的用戶都可以創建項目。一個項目有一個提議者。我想要的是能夠從Project.Proposer獲得講師或學生類型,但我似乎無法做到這一點。我也不確定Project.Proposer是否應該是項目類中的User(基類)類型,是否可以使用接口(使用代碼優先)或什麼。

我會很感激任何指導或想法的人可以給我,我已經嘗試了很多變化,但似乎沒有給我想要的結果。注意:我試圖避免擁有冗餘數據的用戶類,所以我不希望用戶類包含講師和學生的字段。

回答

2

在EF4 CodeFirst中正確使用此方法的方法是在項目上擁有Proposer類型的User屬性。

檢索該項目後,Proposer將具有正確的類型,但該值將被框爲User。爲了弄清楚什麼實際的實際類型,你可以使用is關鍵字如下:

// project is a Project instance  
if (project.Proposer is Lecturer) 
{ 
    // do something 
} else if (project.Proposer is Student) 
{ 
    // do something else 
} 

這是數據結構,我建議:

public class Tag 
{ 
    [Key] 
    public int ID { get; set; } 
} 

public abstract class User 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Forename { get; set; }   
    public string Surename { get; set; } 
} 

public class Lecturer : User 
{ 
    public IEnumerable<Tag> Forename { get; set; } 
} 


public class Student : User 
{ 
    public IEnumerable<Tag> Forename { get; set; } 
} 

public class Project 
{ 
    [Key] 
    public int ID { get; set; } 

    public User Proposer { get; set; } 
} 

還有其他的方法來構建這個,比如使用LecturerProjectStudentProject這樣的類爲項目引入層次結構,並將Proposer以正確的類型移動到這些類中,但不建議這樣做。因爲你將一直需要分別處理這些項目類。例如,當檢索項目名稱和它的提議者時。由於基礎項目類不再有提議者屬性,因此您需要兩次具有相同的查詢。我希望我能說明使用這種方法時出現的問題。


下一個問題你需要問自己的是,你關心數據如何保存在數據庫?由於有3種方式與繼承這樣的類:建議

一個字。如果你不打算存儲數百萬條記錄,不要介意它是如何存儲在數據庫中的。 Table per Hierarchy是迄今爲止最容易使用的,特別是在開始時,它也是默認設置。

+0

謝謝,這似乎是工作。無論如何,必須有講師項目和學生項目(又是基礎班和不同的子班),因爲他們有不同的領域。感謝有關不同繼承的鏈接,一個有趣的閱讀,這是很好的知道如何工作。除了is機制外,我也一直在使用實體框架OfType 。再次感謝你的幫助 – Manatherin 2012-02-26 13:26:20

0

如果你不想有一個用戶類作爲投保人,如何有一個屬性像ProposedUserId,與ID,您可以查詢User類檢查用戶的角色是什麼,然後獲取必要的細節來自講座或學生表