天天看點

AutoMapper自動映射

十年河東,十年河西,莫欺少年窮。

學無止境,精益求精。

不扯犢子,直接進入正題:

AutoMapper自動映射常用于EF中,能很好的解決DTO和Model之間互相映射的問題。在未使用AutoMapper之前,我們回顧下傳統的對象互相映射的方法。

首先貼出本節要用到的DTO,學生表及系表,他們之間存在主外鍵關系!如下:

AutoMapper自動映射
AutoMapper自動映射

View Code

假設,現在要求将得到的學生對象轉化為Model

建立學生對象Model

AutoMapper自動映射
AutoMapper自動映射

傳統方法如下:

AutoMapper自動映射
AutoMapper自動映射

傳統方法實作互相映射存在一個弊端,如果資料表字段特别多,那麼,試問你需要寫多少行代碼?

OK,AutoMapper閃亮登場,那麼如果使用AutoMapper需要寫什麼樣的代碼呢?

AutoMapper自動映射
AutoMapper自動映射

由上述代碼可知,其互相映射隻需一行代碼搞定。這裡需要注意,你定義的Model層個字段屬性要和DTO層字段屬性一緻。

OK,那如果需要轉化一個泛型集合呢?

AutoMapper自動映射
AutoMapper自動映射

那麼,AutoMapper是否可以做到呢?

當然,可以...

AutoMapper自動映射
AutoMapper自動映射

有上述代碼可知,是不是連Foreach都省了?

哈哈,OK,這些都是些基礎功能,咱們繼續深究。

如果需要映射導航屬性對應表中的字段怎麼寫呢?

我們将StudentModel修改成如下:

AutoMapper自動映射

首先用傳統方法實作如下:

AutoMapper自動映射
AutoMapper自動映射
AutoMapper自動映射

傳統方法變化不大,那麼,用AutoMapper怎麼實作呢?

AutoMapper自動映射
AutoMapper自動映射
AutoMapper自動映射

在這裡,我要告誡大家關于使用懶加載的注意事項,如果你不注意,那麼你寫的代碼效率有可能将會非常低。

AutoMapper自動映射

生成了2條SQL語句:

AutoMapper自動映射

OK,僅僅生成兩條SQL語句還可以接受,但是如果你的項目資料表關系比較複雜,有很多導航屬性時,就會生成很多SQL語句,會産生極大的性能問題。

那麼關于懶加載的問題怎麼解決呢?還好,EF中有Include,在使用Include時需要引入using System.Data.Entity;

将上邊的程式修改成如下:

AutoMapper自動映射
AutoMapper自動映射
AutoMapper自動映射

使用Include,其實相當于聲明棄用懶加載,這裡使用顯示加載!

OK,關于使用AutoMapper應用懶加載的方法講完了。正如上述所說:AutoMapper是将DTO映射成Model,如果反過來映射是否可行呢?

還好,AutoMapper提供了.ReverseMap();方法,将Model映射成DTO,如下:

AutoMapper自動映射
AutoMapper自動映射
AutoMapper自動映射

OK。截止到這裡,關于AutoMapper的基礎用法也就講完了,本人能力有限,如有未提及之處,請大家多多指點。希望大家喜歡!

@陳卧龍的部落格