ORM-Dapper+DapperExtensions


ORM-Dapper+DapperExtensions

現在成熟的ORM比比皆是,這里只介紹Dapper的使用(最起碼我在使用它,已經運用到項目中,小伙伴們反饋還可以)。

優點:

1、開源、輕量、小巧、上手容易。

2、支持的數據庫還蠻多的, Mysql,SqlLite,Sqlserver,Oracle等一系列的數據庫。

3、Dapper原理通過Emit反射IDataReader的序列隊列來快速的得到和產生對象。性能貌似很牛逼的樣子

缺點:

作為一款ORM太過於輕量級了,根據對象自動生成sql的功能還是空白,需要自己來擴展,

當然這也是優點,  好聲音的導師們經常說某人就是張白紙……  

 

因此針對Dapper已經有很多成熟的擴展項目了,Dapper.Rainbow、Dapper.Contrib,DapperExtensions。

我們這里介紹的是DapperExtensions

 

dapper-dot-net源碼:https://github.com/StackExchange/dapper-dot-net   (更新頻率快,項目包含了各種除了Dapper-Extensions的 擴展項目)

Dapper-Extensions 源碼:https://github.com/tmsmith/Dapper-Extensions 

Dapper-Extensions的優點

1、開源

2、針對Dapper封裝了常用的CRUD方法,有獨立的查詢語法。

3、需要映射的實體類本身0配置,無需加特性什么的。是通過獨立的映射類來處理,可以設置類映射到DB的別名,字段的別名等等。

Dapper-Extensions的缺點:

1、好幾年沒更新了

2、不支持oracle(木有oracle的方言,已經搞定)  

3、不能同時支持多種數據庫(已經搞定)

4、部分代碼有些bug(發現的都搞定了)

 

下面先簡單介紹一下Dapper的基本語法。

Dapper就一個.cs文件,可以放到項目代碼中直接編譯,也可以直接引用DLL文件。

Dapper對DB的操作依賴於Connection,為了支持多庫,咱們用 IDbConnection conn

using (IDbConnection conn = GetConnection())
    {
        const string query = "select * from XO order by id desc";
        return conn.Query<XOEntity>(query,null);
    }

下面是帶參數的語法

復制代碼
int xoID=666; //變量主鍵
using (IDbConnection conn = GetConnection()) { const string query = "select * from XO where Id=@MyID"; return conn.Query<XOEntity>(query, new { MyID = xoID}); }
復制代碼

 

各種方法都重載了事務的操作,一般的數據庫操作都支持。但是每次執行都需要傳遞sql,而且每次都要使用Using,看着不爽啊, 這…… 

好吧下面簡單介紹下使用Dapper-Extensions的基本語法(在Dapper-Extensions  的基礎上用了Repository模式,代碼效果如下)。

復制代碼
            //實體類
            DemoEntity entity = new DemoEntity();

            //根據實體主鍵刪除
            this.Delete<DemoEntity>(entity);

            //根據主鍵ID刪除
            this.Delete<DemoEntity>(1);

            //增加
            this.Insert<DemoEntity>(entity);

            //更新
            bool result = this.Update<DemoEntity>(entity);

            //根據主鍵返回實體
            entity = this.GetById<DemoEntity>(1);

            //返回 行數
            this.Count<DemoEntity>(new { ID = 1 });

            //查詢所有
            IEnumerable<DemoEntity> list = this.GetAll<DemoEntity>();

            IList<ISort> sort = new List<ISort>();
            sort.Add(new Sort { PropertyName = "ID", Ascending = false });


            //條件查詢
            list = this.GetList<DemoEntity>(new { ID = 1, Name = "123" }, sort);

            //orm 拼接條件 查詢
            IList<IPredicate> predList = new List<IPredicate>();
            predList.Add(Predicates.Field<DemoEntity>(p => p.Name, Operator.Like, "不知道%"));
            predList.Add(Predicates.Field<DemoEntity>(p => p.ID, Operator.Eq, 1));
            IPredicateGroup predGroup = Predicates.Group(GroupOperator.And, predList.ToArray());

            

            list = this.GetList<DemoEntity>(predGroup);


            //分頁查詢
            long allRowsCount = 0;
            this.GetPageList<DemoEntity>(1, 10, out allRowsCount, new { ID = 1 }, sort);
復制代碼

 

在說ORM之前,還是要說一下HY.DataAccess這個模塊

 

 

這個模塊是對數據訪問提供的一個Helper的功能,里面包含了 各種DB的SqlHelper,分頁。

DBHelper 都繼承自IDBHelper.cs

  View Code

 

IDBSession.cs 對數據訪問對象的定義

  View Code

 

SqlConnectionFactory.cs 這個類是采用工廠模式創建DB連接的封裝,代碼如下:

  View Code

 ORM也不是萬能的,比如做大數據的批量插入什么的,還是需要SqlHelper,加上有的人就喜歡DataTable或者DataSet。

所以SqlHelper作為根基,ORM作為輔助,萬無一失啊。

 

下面說說ORM這塊的實現方式。見下截圖

 

IDataServiceRepository.cs(提供業務層使用,里面的方法不支持傳遞sql,包含sql的語句最好還是放在數據層操作的好)

  View Code

  IDataRepository.cs(提供數據層使用,繼承了上面的IDataServiceRepository,支持傳入sql)

  View Code

  RepositoryServiceBase.cs(IDataServiceRepository的實現類)

  View Code

 RepositoryBase.cs(IDataRepository的實現類)

  View Code

 

 說起DapperExtensions修改的小地方還蠻多的,下圖是一個代碼比較的截圖。所以一會把代碼打包貼上來吧(見文章結尾)。

 

 上述代碼就可以編譯成 HY.ORM.DLL文件了。

 

下面就可以在 自己業務層繼承HY.ORM中的RepositoryServiceBase類   ,數據層繼承HY.ORM中的 RepositoryBase類。

通過各自的構造函數或者, SetDBSession(Helper.CreateDBSession());  進行數據連接初始化。

 

 

接下來配置實體類和DB的映射:

復制代碼
    public class DemoEntity
    {        
        public int ID { get; set; }

        public string Name { get; set; }
    }

    [Serializable]
    public class DomoEntityORMMapper : ClassMapper<DemoEntity>
    {
        public DomoEntityORMMapper()
        {
            base.Table("Demo");
            //Map(f => f.UserID).Ignore();//設置忽略
            //Map(f => f.Name).Key(KeyType.Identity);//設置主鍵            
            AutoMap();
        }
    }
復制代碼

 

 

 

 

這樣就可以在類中  實現   this.Get<DemoEntity>("select * from  Demo where ID=@ID", new { ID = 1 });   這樣的語法了。

 

 

 

 

 

下載:

HY.DataAccess

修改后的DapperExtensions:Dapperextensions.RAR 

 

相關文章:

搭建一套自己實用的.net架構(1)【概述】

搭建一套自己實用的.net架構(2)【日志模塊-log4net】

搭建一套自己實用的.net架構(3)【ORM-Dapper+DapperExtensions】

 

Top
收藏
關注
評論
 
分類:  架構
標簽:  DapperORMRepositoryDapperExtensionsasp.net


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM