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

(源码下载)高灵活度,高适用性,高性能,轻量级的 ORM 实现

时间:2015-06-08 11:28:17      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

我在上一篇博客中简单说明了一个面向内存数据集的“ORM”的实现方法,也提到我的设计实现或许不能称之为“ORM”,姑且称之为 S-ORM吧。

 

可能有些小伙伴没有理解我的思路和目的,与传统ORM框架做了简单比较,事实上我要做的事情并非为数据库表结构建立实体对象模型,而是希望使用传统的 ADO.NET 方式来操作数据库,并对 ADO.NET 所得到的结果数据集,进行松散的动态映射;同时提供一些类ORM的自动化方法,简化传统 ADO.NET 对数据库的操作。

 

再此再次简单说明设计目标:

1.支持所有数据库原生操作(ADO.NET / 基于微软企业库的数据模块)

2.解除与数据库表模型一对应的关系,由开发人员灵活指定映射关系

3.支持直接使用SQL语句并根据查询结果动态映射。

4.支持调用存储过程并根据查询结果动态映射。

5.支持自动化的事务处理,可自动回滚。

6.支持一对多的映射关系,即一个实体类可以映射到多张表。

7.支持自动填充/补全数据实体类中的数据。

8.高性能,高灵活性,高可维护性。

 

详细说明可参考我的上一篇博客:http://www.cnblogs.com/sheng_chao/p/4553832.html

 

在此补充几个应用场景的小例子:

1. 表 User 中有若干字段(>2),现在只想取出其中 2 个字段建立对象实例并序列化发送至客户端。

  定义一个包含所需 2 个字段的对象(假设为 User_A ),通过 S-ORM 提供的 Attribute 指定该对象与数据库表结构的对应关系,使用 Fill 方法自动填充该对象的属性。

    [Table("User")]
    public class User_A
    {
        [Key]
        public Guid Id
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public int Age
        {
            get;
            set;
        }
    }

填充该对象:

public User_A GetUser_A(Guid id)
        {
            User_A user = new User_A();
            user.Id = id;
            if (_dataBase.Fill<User_A>(user))
                return user;
            else
                return null;
        }

 

2. 希望使用 SQL 语句从数据库表中查询数据,将结果实例化为强类型对象实例。

  在此场景中,结果集可能来自于多张表,或者结果集根本就是某些数据的复杂统计结果。与表结构的设计完全无关,使用 S-ORM 非常简单,同上先定义好对象类型,然后使用类似如下方法:

        public List<User_A> GetData(Guid id)
        {
            List<CommandParameter> parameterList = new List<CommandParameter>();
            parameterList.Add(new CommandParameter("@userId", id));
            List<User_A> userList = _dataBase.Select<User_A>(
                "SELECT * FROM [User] INNER JOIN [Product] ON [User].[Id] = [Product].[UserId] WHERE [User].[Id]= @userId", parameterList);
            return userList;
        }

在此可以看到, S-ORM 所做的事情非常简单,对 ADO.NET 返回的数据集,与指定的对象类型 User_A ,进行动态映射,得到 User_A 类型的实例集合。

注意:S-ORM 不强制要求对象类型定义与内存数据集字段一一对应,在上一博客中已有详细说明,请参考。

 

3. 调用存储过程,得到强类型对象集合结果。

  同上例目的基本一致,对于复杂查询,直接使用数据库所提供的强大查询功能:视图,存储过程,自定义函数,将得到的结果集自动化映射为强类型对象实例。

  先定义我们想要的对象类型,不再赘述,然后借助 S-ORM:

public List<Record> GetReport(Guid id)
        {
            List<CommandParameter> parameterList = new List<CommandParameter>();
            parameterList.Add(new CommandParameter("@id", id));
            DataSet dataSet = _dataBase.ExecuteDataSet(
                CommandType.StoredProcedure, "GetRecord", parameterList, "Result");
            List<Record> reportList = RelationalMappingUnity.Select<Record>(dataSet);
            return reportList;
        }

 

上面 3 个示例基本代表了 S-ORM 的设计目的,同时 S-ORM 也提供了许多相关的辅助功能,和与传统 ORM 类似的增删改查方法,请参考上一篇博客中的详细介绍。

 

源代码下载:http://121.40.198.87:8010/S-ORM.zip    

 

 

小广告

博主正在留意南京的相关高级职位

江苏电信10000号前技术经理,现任某外资企业Team Leader

简历:http://121.40.198.87:8010/

使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序:

http://www.cnblogs.com/sheng_chao/p/4387249.html

使用 WPF+ ASP.NET MVC 开发 在线客服系统 (一):

http://www.cnblogs.com/sheng_chao/p/4548146.html

(源码下载)高灵活度,高适用性,高性能,轻量级的 ORM 实现

标签:

原文地址:http://www.cnblogs.com/sheng_chao/p/4560252.html

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