2009-01-21 25 views
2

如果一個標誌IsAdmin,作爲AdminUser轉換,否則轉換爲NormalUser。實體框架:基於列值的類型?

只是好奇這個,但不知道如何去做。我確實看到,您可以根據表中的值和另一個表創建一個子對象,如:

SiteUser從表中可以Site_User 管理用戶從表中可以Site_User和Admin_User當Site_User.IsAdmin =真

然而,我很好奇你是否可以這樣做:

如果IsAdmin爲true,則轉換爲AdminUser,否則轉換爲NormalUser,其中AdminUser:SiteUSer和NormalUser:SiteUser但不存在Admin_User表或Normal_User表。這完全是基於相同表格和列值的投射。該類型抱任何的附加信息,只是會像的情況下會有所幫助:

SomeMethod(SiteUser someUser) 
{ 
    if(someUser is AdminUser) 
    { 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 

相反的:

SomeMethod(SiteUser someUser) 
{ 
    if(someUser.IsAdmin) 
    { 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 

現在我意識到這可能不是最好的例子,但表示該標誌爲多價值屬性,而不是:

SomeMethod(SiteUser someUser) 
{ 
    swith(someUser.Role) 
    { 
     case(1): 
      break; 
     case(2) 
      break; 
    } 
} 

當然,這可能是一個壞主意,但想知道是否有可能。

回答

2

實體框架支持Table-Per-Type和Table-Per-Hierarchy繼承。

Table-Per-Type表示每個類使用一個新表,包括抽象類型。 「按層次分類」表示使用單個表來存儲多種類型的數據,並且僅從該表中抽取該類型所需的列。

無論哪種方式,都可以按照您描述的方式測試對象。在使用這兩種

if (someUser is AdminUser) 
{ 
    ... 
} 
else 
{ 
    ... 
} 

更多信息可以在這裏找到,而且他們都是在實體框架設計可視化支持:

Table-Per-Type

Table-Per-Hierarchy

0

作爲一個經驗法則,檢查某個對象是否是給定類的實例並不是一個好習慣。嘗試使用方法或屬性(someUser.isAdmin())。

反正我不確定你的問題是什麼?

+0

是的,你可能是正確的第一部分,第二部分並不讓我感到驚訝,因爲我不是100%確定如何問。 – 2009-01-21 18:35:43