Dapper使用


公司的項目使用了Dapper做數據庫連接處理,感覺不錯,自己研究一下怎么用。

在網上找了找資料對Dapper都比較推崇。主要是兩個方面,一個是連接速度很快,一個是代碼開源且簡單,只有一個SqlMapper.cs文件,是一個輕型的ORM類。

從這篇博客里面找到它的一些介紹和使用方式,但奈何英文太差,只好自己再做個筆記。http://www.cnblogs.com/yipu/archive/2012/11/21/2780199.html

 

首先從GitHub上獲取Dapper:https://github.com/SamSaffron/dapper-dot-net

下載完了以后,打開工程,有下面的目錄

 

當然這么多都是分版本表示,其實這么多文件就取三個文件就可以了,一個SqlMapper.cs,一個是Database.cs,再加一個擴展屬性的類IgnorePropertyAttribute.cs。我用的是.Net4.0 所以我取的 4.0下面的文件,放入我的工程修改其命名空間為我的即可。


        

 

 

這個時候我們就可以測試了

 class Program
    {
        static string _strConn = "Data Source=192.168.11.128;Initial Catalog=PD_ShopDB;uid=sa;password=123;";
        static string _strSQL = "SELECT BrandID,BrandName,IsEnable,BrandEnName,BigLogo,SmllLogo,BrandStory,BrandLink,IsDelete,CreateDate  FROM Brands  WITH(NOLOCK)";
           
        static void Main(string[] args)
        {
            using (SqlConnection connection = new SqlConnection(_strConn))
            {
                connection.Open();
                var brand = connection.Query<Brands>(_strSQL).ToList();
                foreach (var item in brand)
                {
                    Console.Write(item.BrandID + " " + item.BrandName);
                }
            }

            Console.ReadKey();
        }       
    }

 

測試結果

上面是查詢,再看一下插入和更新,同樣在Dapper源碼里面找到SqlMapperExtensions.cs,這個在Dapper.Contrib項目下面,將其添加到自己的工程里面,同樣修改其命名空間

 

然后在測試

class Program
    {
        static string _strConn = "Data Source=192.168.11.128;Initial Catalog=PD_ShopDB;uid=sa;password=123;";
        static string _strSQL = "SELECT BrandID,BrandName,IsEnable,BrandEnName,BigLogo,SmllLogo,BrandStory,BrandLink,IsDelete,CreateDate  FROM Brands  WITH(NOLOCK)";
           
        static void Main(string[] args)
        {
            using (SqlConnection connection = new SqlConnection(_strConn))
            {
                connection.Open();
      
                connection.Insert<Brands>(new Brands() { BrandName = "手機", BrandEnName = "Phone", IsEnable = true, CreateDate = DateTime.Now });
                
                var brands = connection.Query<Brands>(_strSQL).ToList();
                foreach (var item in brands)
                {
                    Console.WriteLine(item.BrandID + " " + item.BrandName );
                }

                var brand = brands.First();
                brand.BrandName = "家用電器";
                connection.Update<Brands>(brand);

                Console.WriteLine("-------------更新后");

                var brands2 = connection.Query<Brands>(_strSQL).ToList();
                foreach (var item in brands2)
                {
                    Console.Write(item.BrandID + " " + item.BrandName);
                }
            }

            Console.ReadKey();
        }       
    }

 

測試結果

 

OK已經達到要求了,不過在使用的過程中,有一個小問題,就是自增列的處理,原生態的實體類代碼中,將自增列聲明為[Key],而我自己的用的是Linq的[Columm]

 

我在KeyPropertiesCache方法中將其進行了修改

 private static List<PropertyInfo> KeyPropertiesCache(Type type)
        {

            IEnumerable<PropertyInfo> pi;
            if (KeyProperties.TryGetValue(type.TypeHandle, out pi))
            {
                return pi.ToList();
            }

            var allProperties = TypePropertiesCache(type);
            // var keyProperties = allProperties.Where(p => p.GetCustomAttributes(true).Any(a => a is KeyAttribute)).ToList();
            //因聲明主鍵的方式不同,對自增列進行排除
            var keyProperties = allProperties.Where(p => p.GetCustomAttributes(true).Any(a => ((a is System.Data.Linq.Mapping.ColumnAttribute))
                                                    && ((System.Data.Linq.Mapping.ColumnAttribute)a).IsPrimaryKey)).ToList();
            if (keyProperties.Count == 0)
            {
                var idProp = allProperties.FirstOrDefault(p => p.Name.ToLower() == "id");
                if (idProp != null)
                {
                    keyProperties.Add(idProp);
                }
            }

            KeyProperties[type.TypeHandle] = keyProperties;
            return keyProperties;
        }

 

關於Dapper的使用,用官方給的原生態的代碼就可以實現了。一般用的時候,框架都會對其進行二次封裝,以利於項目的開發。

 


免責聲明!

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



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