2016-09-16 73 views
0

我一直在試圖在任何地方找到這個答案,並覺得我一定不知道我需要的正確關鍵詞,所以我希望能在這裏找到答案。在數據層和邏輯層之間映射/轉換數據

所以我建立,有一個項目連接這樣:

數據庫<>數據層<>邏輯層<> UI

當數據到達邏輯層,我想執行輕微轉換。首先,我將演示代碼,然後解釋我正在嘗試做什麼。

我有一個「PersonDao的」數據層內與下面設置對象:

public class PersonDao 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int GenderID { get; set } 
} 

並用以下一個「GenderDao」對象:

public class GenderDao 
{ 
    public int GenderID { get; set; } 
    public string Name { get; set; } //this essentially holds 'male' and 'female' 
} 

在邏輯層,我在反映數據層的邏輯層內有'PersonDto'對象:

public class PersonDto 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int GenderID { get; set } 
} 

並且當然是'Gende rDto」對象,數據層內體現出其對應現在

public class GenderDao 
{ 
    public int GenderID { get; set; } 
    public string Name { get; set; } 
} 

,有了這些信息,我所要做的是可以創建一個自動映射或某種形式的轉換,讓我自動匹配GenderDto.Name到PersonDto.GenderID。我基本上要:

PersonDto.GenderID = GenderDto.Name其中GenderDto.GenderID == PersonDto.GenderID

和扭轉這種映射爲好。

的最終目標是,在UI層內,用戶可以拉一個人的個人資料,並會看到類似這樣的:

  • 名字:約翰
  • 姓:李四
  • 性別:男

用戶也可以在表單中輸入相同的信息,該表單將信息傳遞給邏輯層,然後將該性別名稱轉換回GenderID,以便它可以成爲存儲在數據庫中。

任何幫助將不勝感激,謝謝。

+0

你有什麼麻煩? – Nix

+0

本質上,已經有一個映射到DAL內的實體框架,並且已經安裝了AutoMapper。 但我希望BLL(邏輯層)能夠轉換映射,以便當UI層看到數據時,他們會獲得性別(女性/男性)而不是int表示。 – Azu

+0

反過來,我希望能夠重新轉換,以便當用戶輸入男性/女性時,數據庫獲得int表示以應用於表格數據 – Azu

回答

0

你想要的是對象關係映射。這就是Entity Framework能夠做到的事情。你可以實現類似於Entity Framework的東西,或者你必須自己編寫關係映射邏輯。

+0

實體框架已存在於DAL內,對於關係映射,那是我掙扎的地方。我已經嘗試過很多我讀過的東西,都以失敗告終。 一些例子: - 試圖利用.Where() - 嘗試一個LINQ(但是,我找不到足夠的信息與我正在嘗試做什麼 - 這可能是問題) - 試圖使用.ForMember() – Azu

+0

重構映射的一部分感謝無愛,我不知道我是如何忽略你的建議的,但我將對ORM進行研究。如果我需要進一步的幫助,我將返回 – Azu

+0

研究ORM幫助我找到了我需要的答案。再次感謝你無情 – Azu

5

您還可以查看AutoMapper內的自定義投影。麻煩的是,如果這些預測需要訪問其他EF事物,那麼您就遇到了麻煩。

您的DAO看起來幾乎完全像您的DTO?如果是這樣,我會完全避免DTO,他們可能不會增加任何價值。直接使用你的DAO。

通常,我的DTO是我的實體在EF中的一小部分,只是視圖模型的一些屬性。因爲我的視圖模型代表任務/命令,所以我並不真正反轉地圖。我不會試圖建立一個分層的架構 - 它沒有太多的價值。許多類型沒有太多的回報。

相關問題