码迷,mamicode.com
首页 > 其他好文 > 详细

ORM框架示例及访问测试(10种框架)

时间:2015-04-13 16:26:44      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

继上次ORM之殇,我们需要什么样的ORM框架? 

整理了10个ORM框架测试示例,排名不分先后

  • CRL
  • EF
  • PDF
  • XCODE
  • NHibernate
  • MySoft
  • Moon
  • Cyq
  • Dapper
  • IBatisNet

上面的框架里,风格不一,多数为半对象化,需要以参数形式传值,效率可能高点,但编程性和便捷性就会差点

目的

  1. 测试ORM数据访问性能,比较简单粗暴,统计对象映射转换和返回时间,(纯对象化的ORM用时会比用参数形式的ORM长)
  2. ORM开发调用实现方式,不同ORM开发风格和便捷性一目了然

测试结果

  • EF和NHibernate平均下来稍慢点,其它区别不大
  • 实现方式纯对象化操作的ORM会更方便点

为了体现ORM过程,尽量使用对象来表示

实体接口

public interface IProduct
    {
        int Id { get; set; }
        string ProductId { get; set; }
        string ProductName { get; set; }
        string BarCode { get; set; }
        DateTime AddTime { get; set; }
    }

测试接口

public interface ITester
    {
        IProduct GetProduct(int index);
        string Remark { get; }
        bool Insert(int index);
        int Select(int index);
        int Update(int index);
        int Delete(int index);
    }

接口实现示例

public class CRLTester : ITester
    {
        public string Remark
        {
            get
            {
                return "";
            }
        }
        public IProduct GetProduct(int index)
        {
            return new Product() { Id = index, ProductName = "ProductName" + index, BarCode = "BarCode" + index, AddTime = DateTime.Now };
        }
        public bool Insert(int index)
        {
            var data = GetProduct(index) as Product;
            ProductManage.Instance.Add(data);
            return true;
        }

        public int Select(int index)
        {
            var data = GetProduct(index) as Product;
            var list = ProductManage.Instance.QueryList(b => b.ProductName == data.ProductName);
            return list.Count;
        }

        public int Delete(int index)
        {
            var data = GetProduct(index) as Product;
            var n = ProductManage.Instance.Delete(b => b.Id == data.Id);
            return n;
        }


        public int Update(int index)
        {
            var data = GetProduct(index) as Product;
            //因为不是查询出来的,手动设置哪些属性被更改了
            data.Change(b => b.ProductName);
            data.Change(b => b.BarCode);
            return ProductManage.Instance.Update(data);
        }
    }

测试过程,调用接口实现,对增删改查循环执行指定次数

static string DoTest(ITester tester, TestType type,int n)
        {
            Stopwatch sw = new Stopwatch();
            //插入
            sw.Start();
            for (int i = 1; i <= n; i++)
            {
                switch (type)
                {
                    case TestType.DELETE:
                        tester.Delete(i);
                        break;
                    case TestType.INSERT:
                        tester.Insert(i);
                        break;
                    case TestType.SELECT:
                        tester.Select(i);
                        break;
                    case TestType.UPDATE:
                        tester.Update(i);
                        break;
                }
            }
            sw.Stop();
            var times = sw.ElapsedMilliseconds;
            var avg = times / Convert.ToDouble(n);
            return string.Format("{0},用时 {1} 毫秒 平均 {2}", type, sw.ElapsedMilliseconds, avg);
        }

运行截图,没有使用本地数据库,数据没有参考性

技术分享

项目下载地址:http://files.cnblogs.com/files/hubro/ORMTest.rar

请更改config文件中的数据连接,IBatisNet需单独修改

ORM框架示例及访问测试(10种框架)

标签:

原文地址:http://www.cnblogs.com/hubro/p/4422068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!