Enterprise Library 5 數據訪問之二、自定義RowMapper使用

一、應用場景:

由於數據庫設計和對象設計並不是一對一的,有時候一張數據表可以拆出多個對象來表述該數據表信息,也有時候多個數據表的某些字段被提取出來對應一個業務對象,這時候自定義RowMapper就有了用武之地。

二、演示代碼:

創建一張數據表:User表

if exists (select 1
            from  sysobjects
           where  id = object_id('"User"')
            and   type = 'U')
   drop table "User"
go

create table "User" (
   Id                   int                  identity,
   Name                 nvarchar(50)         null,
   Pwd                  nvarchar(50)         null,
   constraint PK_USER primary key (Id)
)
go
創建一個業務實體對象UserInfo:

public class UserInfo
    {
        public int Id { set; get; }
        public string T_UserName { set; get; }
        public string T_Password { set; get; }
    }   
小提示:注意User表和UserInfo對象並非一 一對應哦

現在我們創建一個自定義的 UserInfoMap

 public class UserInfoMap : IRowMapper<UserInfo>
    {
        public UserInfo MapRow(IDataRecord row)
        {
            UserInfo u = new UserInfo() { Id = int.Parse(row.GetString(0)), T_UserName=row.GetString(1), T_Password=row.GetString(2) };
            return u;
        }
    }
 自定義數據映射工作已經做完,現在我們去看如何使用我們自定義的RowMapper,貼上核心代碼如下:

  /// <summary>
        /// 獲取單個對象數據
        /// </summary>
        /// <param name="id">Id</param>
        /// <returns></returns>
        public UserInfo GetUserInfo(int id)
        {           
            string cmdText = string.Format("select * from UserInfo where id={0}", id);
            var accrssor = db.CreateSqlStringAccessor(cmdText, new UserInfoMap());
            var customerData = accrssor.Execute();
            return customerData.FirstOrDefault<UserInfo>();
        }
        /// <summary>
        /// 獲取一個對象集合數據
        /// </summary>
        /// <returns></returns>
        public List<UserInfo> GetUserList()
        {
            string cmdText = "select * from UserInfo";
            var accrssor = db.CreateSqlStringAccessor<UserInfo>(cmdText, new UserInfoMap());//MapBuilder<UserInfo>.BuildAllProperties()
            var data = accrssor.Execute();
            return data.ToList<UserInfo>();
        }

注意:紅色字體標記的既是應用了自定義RowMap地方

補充:或者放棄自定義RowMapper可以這樣寫

        public UserInfo GetUserInfo(int id)
        {           
            string cmdText = string.Format("select * from UserInfo where id={0}", id);
            var accrssor = db.CreateSqlStringAccessor(cmdText,
                MapBuilder<UserInfo>.MapAllProperties()             
                .Map(x => x.UserName).ToColumn("UserName")
                .Map(x => x.Password).ToColumn("Password")
                .Build()
                );
            var customerData = accrssor.Execute();
            return customerData.FirstOrDefault<UserInfo>();
        }


                                                                                                                                                                                                                                                               


                                                                                                                                                                                                                                                        至此結束。歡迎拍磚.........

                                                                                                                                                                                                                                                                                          






發佈了155 篇原創文章 · 獲贊 11 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章