2012-11-19 36 views
0

我試圖設置從數據庫檢索。 我有EF(實體框架)對象emUser和從emUser繼承的普通類User,但添加了一些額外的功能。從實體框架對象的繼承

public class User : emUser 
{ 
    #region Properties 
    public string Username 
    { 
     get { return Email; } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
    #endregion 
} 

public partial class emUser : EntityObject 
{ 
    [code ...] 
} 

由於某些原因,雖然User從emUser繼承我不能明確地轉換它們。 我正在使用的代碼:

List<User> returnUsers = new List<User>(); 
var users = 
    (from u in edm.UserSet.OfType<emUser>() 
    select u); 

    if (users != null) 
    { 
     foreach (emUser user in users) 
     { 
      User newUser = (User)user; 
      returnUsers.Add(newUser); 
     } 
    } 
return returnUsers; 

我能爲User一個emUser包裝,但我會在每次我更改emUser時間來改變它。我想使用User來區分技術服務層和域層中使用的類。

我得到這樣的錯誤消息:

{System.InvalidCastException: Unable to cast object of type 'Services.emUser' to type 'Users.User'. at Services.DatabaseController.GetUsers() in [file path]:line 412} 

爲什麼我不能轉換emUser到用戶?

+0

甲'User'是一個'emUser',但一個'emUser'不是'User'。你不能那樣做。 – SLaks

+0

你爲什麼期望這種低調行事? EF只能返回EMUser對象 - 它知道的對象。對於它的價值,我認爲模型層和服務層具有並行數據結構是一個壞主意,並且是對繼承的不好使用。服務層與其下面的層進行通信設計並不錯。如果您需要使用不屬於該圖層的模型類添加功能,請正交。 (使用將模型對象作爲參數的「常規」函數或在服務層定義的擴展方法。) – millimoose

回答

0

你這裏的問題是什麼@millimoose說:EF只能返回emUser對象,因爲它不知道UseremUser可能不是一個User

你從這裏三種可能的解決方案:

  1. 設置UserEntityObject繼承,則有emUser繼承User。這將是一個痛苦的實施,而不是給你任何有用的優勢。
  2. 創建數據傳輸對象以繞過,你基本上是從一個emUser所有屬性複製到User(通常是通過User的構造函數)。這會給你想要的分離,但會是一種痛苦。
  3. 將其他屬性添加到emUser的新partial類中。這是我強烈建議的,因爲它簡單明瞭。

下面是一個例子:

// In a manually generated file in the same project 
public partial class emUser 
{ 
    #region Properties 
    public string Username 
    { 
     get { return Email; } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
    #endregion 
} 

// In the automatically generated file 
public partial class emUser : EntityObject 
{ 
    [code ...] 
} 

用法:

emUser foo = GetUser(); 
Console.WriteLine("FirstName: " + emUser.FirstName); 
Console.WriteLine("FullName: " + emUser.FullName); 
+0

謝謝!這非常有幫助。給了它一些想法後,我想出了相同的解決方案(沒有3)。如果我有一個通用的接口,我可以用它來映射相同的屬性等等,但是在這種情況下使用partial類可能是最好的解決方案! – kumaheiyama

+0

@kumaheiyama - 當然。這就是爲什麼幾乎所有自動生成的代碼(無論是EF,L2S,還是僅僅是一個winform)都是作爲一個部分類生成的 - 易於擴展。樂意效勞! – Bobson

0

您可以在基類不能轉換爲派生類,除非你添加一個轉換操作符。

public class User : emUser 
{ 
    #region Properties 
    public string Username 
    { 
     get { return Email; } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
    #endregion 

    public static explicit operator User (emUser user) 
    { 
     User result = new User(); 
     // set properties 
     return result; 
    } 
} 
+0

謝謝@Moe!這也是一個有用的解決方案,將來可能會使用它。 – kumaheiyama