假設目前有一個檔案資訊的 Model
public class FilesInfo
{
public Guid FILE_ID { get; set; }
public string MODULE_ID { get; set; }
public Guid? REF_CONTENT_ID { get; set; }
public string FILE_TITLE { get; set; }
public string FILE_FILENAME { get; set; }
public string FILE_DL_FILENAME { get; set; }
public int FILE_DL_TYPE { get; set; }
public string FILE_PATH { get; set; }
public string FILE_LINK { get; set; }
public string FILE_URL { get; set; }
public string FILE_DESCRIPTION { get; set; }
public bool IS_ACTIVE { get; set; }
}此時因為頁面上的功能設計關係,我不需要原來 FilesInfo 中那麼多欄位,但需要添加一個註解 (Remark) 的屬性,所以 ViewModel 會變成這樣:
public class FileInfoEditViewModel
{
public Guid FILE_ID { get; set; }
public string FILE_TITLE { get; set; }
public string FILE_LINK { get; set; }
public string FILE_URL { get; set; }
public string FILE_DESCRIPTION { get; set; }
public bool IS_ACTIVE { get; set; }
//New property
public string Remark { get; set; }
}現在,要將自 DB 取到的 FilesInfo 資訊直接對應到 FileInfoEditViewModel 內。當然可以用傳統土法鍊鋼方式一筆筆設定,但這次直接用 AutoMapper,幾行程式就搞定啦!
var file = context.FILE_INFO.Find("id_1");
Mapper.Initialize(x => x.CreateMap());
//我比較偏好這樣: Mapper.Initialize(x => x.CreateMap()); 比較能知道由哪個 Model 對應到哪個 Model
Mapper.Initialize(x => x.CreateMap var mFileInfoEdit = Mapper.Map(file);
上面程式碼執行後,因 FilesInfo 沒有 Remark 對應 Property, 所以 Remark 獲得 NULL。若要在 Mapping 的時候直接給定預設值,可以用 ForMember 指定:
Mapper.Initialize(x => x.CreateMap()
.ForMember(dest => dest.Remark, opt => opt.MapFrom(src => DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " 建立"))
);
model.FileInfoEdit = Mapper.Map(file);
很方便吧!
AutoMapper:
https://github.com/AutoMapper/AutoMapper/wiki
沒有留言 :
張貼留言
注意:只有此網誌的成員可以留言。