麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

基礎才是重中之重~AutoMapper為已有目標對象映射

2019-11-14 13:46:41
字體:
來源:轉載
供稿:網友

回到目錄

AutoMapper各位一定不會陌生,大叔之前的文章中也提到過,曾經也寫過擴展方法,以方便程序開發人員去使用它,而在最近,大叔在一個API項目里,在一個POST請求由DTO對象為實體對象賦值時,出現了一個問題,使用大叔不得不對原有擴展方法再進行二次的補充。

事情是這樣的,有一個DTO對象RequestUserInfo和一個數據庫實體對象UserInfo,在進行POST時,將RequestUserInfo對象的值需要賦給UserInfo對象,我們知道DTO對象是根據接口要求從UserInfo里提取的,它的屬性要少于UserInfo,這在GET請求時,沒有出現任何問題(由userinfo到RequestUserInfo的映射),把對應的屬性值賦到了DTO對象上面,百在POST時,由于DTO對象的屬性少,所以,UserInfo的某些屬性沒有被賦到值,出現了Null。

   /// <summary>    /// DTO 用戶-請求參數    /// 輸入參數各屬性都是可空的,為空時不去驗證,并且查詢時不去構造查詢條件    /// </summary>    public class RequestUserInfo : RequestBase    {        public int? Id { get; set; }        [MaxLength(10, ErrorMessage = "用戶名最多為10個字符")]        public string UserName { get; set; }        [EmailAddress(ErrorMessage = "Email地址不是合法的")]        public string Email { get; set; }        [MaxLength(20, ErrorMessage = "用戶名最多為20個字符")]        public string RealName { get; set; }    }
    public class UserInfo : Entity    {        [DisplayName("用戶名"), Required]// StringLength(50, MinimumLength = 4, ErrorMessage = "用戶名只能由~50個字符組成")        public string UserName { get; set; }        [DisplayName("真實姓名"), Required]//StringLength(30, MinimumLength = 6, ErrorMessage = "真實姓名只能由6~30個字符組成")        public string RealName { get; set; }        [DisplayName("密碼"), Required]// StringLength(20, MinimumLength = 6, ErrorMessage = "密碼由6~20個字符組成")        public string PassWord { get; set; }        [DisplayName("電子郵件"), Required, EmailAddress]        public string Email { get; set; }    }

以上是兩個對象的內容,在AutoMapper的概念里,在GET請求時,UserInfo相當于TSource源對象,RequestUserInfo相當于TResult目標對象,而在POST請求時,這個正好相反,所以我們之前定義的擴展方法就有問題了,它會將UserInfo里的某些屬性變成null,這是正常的,因為在進行AutoMapper時,如果你不給它傳目標對象,它會自動構建一個新對象。

擴展之前的方法,它AutoMapper支持為已有目標對象賦值

 

        /// <summary>        /// 為已經存在的對象進行automapper        /// </summary>        /// <typeparam name="TSource"></typeparam>        /// <typeparam name="TResult"></typeparam>        /// <param name="self"></param>        /// <param name="result"></param>        /// <returns></returns>        public static TResult MapTo<TResult>(this object self, TResult result)        {            if (self == null)                throw new ArgumentNullException();            Mapper.CreateMap(self.GetType().UnderlyingSystemType, typeof(TResult));            return (TResult)Mapper.Map(self, result, self.GetType(), typeof(TResult));        }

 

這樣在程序調用時,會把已經存在的對象result以參數的形式傳入,如下代碼

   public void Update(RequestUserInfo request)        {            var entity = userRepository.GetModel().FirstOrDefault(i => i.Id == request.Id);            request.MapTo<UserInfo>(entity);            userRepository.Update(entity);        }

這時entity是從數據庫里拿出來的完整數據,再把它的DTO屬性進行自動映射賦值,最后把賦值后的對象進行更新!

上面是EF,LINQ這些ORM工具里的通用作法,即先拿出對象,再為指定屬性賦新的值,最后提交到數據庫!

感謝您的閱讀!

回到目錄

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美a视频在线观看 | 欧美国产一区二区三区 | 精品一区二区三区日本 | 国产精品美女久久久久久不卡 | 空姐一级毛片 | 国产精品久久久久久模特 | 久久国产精品久久精品国产演员表 | 黄色羞羞视频在线观看 | 国产精品伦视频看免费三 | 羞羞视频免费入口网站 | 一级视频片 | 亚洲国产精品久久久久久久久久 | 久久精品亚洲欧美日韩精品中文字幕 | 欧美在线中文字幕 | 久久久一区二区 | 亚洲第一页综合 | 国产精品欧美久久久久一区二区 | 国产免费区 | 国产精品一区二区羞羞答答 | 成年人国产视频 | 精品黑人一区二区三区国语馆 | 九草在线| 欧洲精品色 | 在线看一级片 | sm高h视频| 精品亚洲午夜久久久久91 | 最近高清无吗免费看 | 少妇一级淫片免费放正片 | 美女一级毛片 | 爽爽视频免费看 | 国产久草视频在线 | 黄色高清av | 日本人乱人乱亲乱色视频观看 | 成人福利在线 | 国产人成免费爽爽爽视频 | 亚洲爱爱网站 | 中文在线免费观看 | 国产一区二区视频网站 | 日韩视频区 | 国产1区2区3区在线观看 | 久啪视频 |