项目地址 :  https://github.com/kelin-xycs/SimpleEntity

SimpleEntity

一个 用 C# 实现的 简单的 持久层 Entity 实现 。

这是一个 用 C# 实现的 简单的 持久层 Entity 实现 。

和 其它的 持久层 框架 不同 , Simple Entity 并不打算 提供一个 抽象层 来 封装 和 隐藏 关系数据库 。 相反 , 在 SimpleEntity 的 设计 里 , 应用程序 和 关系数据库 之间 是 完全 公开 透明 自由 的 。 SimpleEntity 提供 对象 的 方式 来 访问 数据库 , 帮助 开发 更便捷 , 设计 更清晰(结构化 对象化) 。

SimpleEntity 提供了 一个 DbContext 类 。

DbContext 类 包含 Save(object entity) , Update(object entity) , UpdateNull(string[] columnNames, object id) , Delete(object id) , Flush() , Get(object id) , List Get(object[] ids) 方法 。

Save(object entity) 方法 将 entity Insert 到 数据库 表 中 ;

Update(object entity) 方法 Update entity 对应 的 表 资料 , 只 Update 不为 null 的 Property , 换句话说 , 要 Update 哪个(哪些) 栏位 , 就对 对应 的 Property 赋值 就行 。 不 Update 的 Property 不赋值 。

UpdateNull(string[] columnNames, object id) 方法 用于 将 指定 的 栏位 Update 为 null , 有些时候, 需要 将 某些 栏位 Update 为 null , 就 可以 使用 UpdateNull() 方法 。

Delete(object id) 方法 删除 表 资料 。 参数 id 为 主键 。 只支持 单一列 作为 主键 。 不支持 多列联合主键 。 这也是 OR Mapping 里的 一个 惯例 吧 。

Flush() 方法 将 Save() Update() UpdateNull() Delete() 方法 的 更新结果 提交 到 数据库 。 只有 Flush() 方法 才会 访问 数据库 。 Save() Update() UpdateNull() Delete() 方法 只是 将 更新 转换成 Sql 和 Sql参数 保存起来 。 在 Flush() 的 时候 才 会 批量(Batch)提交 到 数据库 。

Get(object id) 方法 根据 id 返回 entity , id 是 主键 。

List Get(object[] ids) 方法 根据 ids 返回 entityList , ids 是 一组 主键 。 这样可以 一次 返回 多个 主键 的 entity 对象 。

DbContext 是 线程级 的 操作 。 是 线程 安全 的 。 就是说, 在 一个 线程 里 , 可以在 任意个地方 创建任意个 new DbContext() 对象 。 效果 都 一样 。 相同 DB 配置(Connection String, Provider) 的 DbContext 的 更新操作 , 最终都会在 Flush() 方法 里 提交到 数据库 。

为了 更 清楚 的 说明 这一点 , 我们 看一下 这部分 的 实现原理 :

DbContext 实际的 操作 是 调用 SqlClientManager , SqlClientManager 是 实现 IActiveRecordManager 接口 的 一个类 。

SqlClientManager 会把 Save Update Delete 操作 转换 为 Sql 和 Sql参数 , 分别 存在 _sqlList , _paraList 两个 静态变量 里 。 这 2 个 静态变量 是 [ThreadStatic] 标记 标注 的 静态变量 。 就是说, 它们 和 普通的 静态变量 不同, 是 线程级 的 静态变量 。 每个 线程 都有 自己的 这 2 个 静态变量 。

从上面可以看出 , 目前 SimpleEntity 只 支持 SqlServer , 如果 想 支持 别的 数据库 , 比如 Oracle , 那么 可以 新增一个 类 OracleClientManager , 实现 IActiveRecordManager 接口 , 然后 , 把 SqlClientManager 拷贝 过去 稍微 修改 一下 就可以了。 啊 哈哈哈

关于 事务(Transaction) , 可以使用 TransactionScope(System.Transactions.TransactionScope) 。 将 Flush() 放在 TransactionScope 中 就行 。

可以在 Demo 项目 中 查看 Demo , Test.aspx 是 测试 Save Update 等 各种操作 的 页面 , ManageDB.aspx 是 管理 测试 DB 的 页面 , 可以执行 Sql 。

因为 项目 使用 的 是 Asp.net 内置 SqlServer (LocalDb) , 所以 用 一个 ManageDB.aspx 页面 来 管理 DB 。

Demo 项目 是 一个 “Asp.net Web 窗体 项目” , 这个 内置 SqlServer 就是 创建项目 时 自动生成 的 。 mdf ldf 文件 存放在 项目 的 App_Data 文件夹 里 。 创建项目 时 还自动生成了 很多 其它 的 东西 , 我 把 那些 不需要 的 部分 删除 了 。

SimpleEntity的更多相关文章

  1. 使用gson进行json转换

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. 示例代码如下: 实体定义 ...

  2. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  3. Hibernate Validation使用示例及讲解

    Hibernate Validation使用示例及讲解 时间 -- :: ITeye-博客 原文 http://wdmcygah.iteye.com/blog/2174680 主题 Java 在项目开 ...

  4. .NETCore 新型 ORM 功能介绍

    简介 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+. 定义 IFre ...

  5. 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览

    年关将至,首页技术含量文章真是越来越少,理解大家盼着放假过年,哥们我何尝不是,先给大家拜个早年. 兄弟我从11月底发了神经,开启了 ORM 功能库的开发之旅,历时两个月编码和文档整理,目前预览版本更新 ...

  6. 我发起并创立了一个 .Net 平台上的 Web 业务系统 基础库 开源项目 WebEasy

    我 强调一点, 程序员 应该对 程序 有 控制感 . 过多的 控制反转 使 程序员 丧失了 对 程序 的 控制感 . 过多的 依赖注入 束缚了 程序员 的 创造力 . 过度复杂的 架构设计 束缚了 程 ...

  7. hibernate validator自定义校验注解以及基于服务(服务组)的校验

    hibernate validator是Bean Validation 1.1 (JSR 349) Reference Implementation,其广泛的应用在mvc的参数校验中,尤其是使用服务端 ...

  8. how to use greendao in android studio

    http://www.arjunsk.com/android/use-greendao-android-studio/ 1.新建一个java文件MainGenerator.java: import d ...

  9. greenDAO学习分享总结

    greenDAO(最新版本号V2.0.0的Readme) ======== greenDAO is a light & fast ORM solution for Android that m ...

随机推荐

  1. Centos7下cratedb数据导入导出copy to copy from

    crate 创建表结构: 查看表: show tables; 创建表结构: create table tablename (k1 type,k2 type,k3 type);  (type = int ...

  2. Android开发 ---Activity的7种运行状态

     Android开发 ---Activity的7种运行状态 创建 --> 启动 --> 运行 -->  暂停 --> 停止 --> 销毁 重启 操作图解: 1.MainA ...

  3. <Impala><Overview><UDF>

    Overview Apache Impala (incubating) is the open source, native analytic database for apache Hadoop. ...

  4. vue 缩水版 双向绑定

    function Observer(obj, key, value){ var dep = new Dep(); if (Object.prototype.toString.call(value) = ...

  5. python scrapy 数据处理时间格式转换

    def show(self,response): # print(response.url) title = response.xpath('//main/div/div/div/div/h1/tex ...

  6. python操作sqlite3的几项问题分析

    不同数据库还是有各自特点的,之前自以为熟悉mysql,然后全都照搬到sqlite3上,这样果然是不行的.笔者就近期在使用sqlite3时碰到的问题做了总结分析,并给出相应解决方法,供大家参考. 1.如 ...

  7. scrapy-CrawlSpider的rules使用规则

    1.allow设置规则的方法:要能够限制在我们想要的url上面.不要跟其他的url产生相同的正则表达式即可: 2.什么情况下使用follow:如果在爬取页面的时候,需要将满足当前条件的url再进行跟进 ...

  8. shell统计当前文件夹下的文件个数、目录个数

    1. 统计当前文件夹下文件的个数 ls -l |grep "^-"|wc -l 2. 统计当前文件夹下目录的个数 ls -l |grep "^d"|wc -l ...

  9. maven修改本地仓库,远程仓库与中央仓库

    什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如 log4j.jar,junit. ...

  10. 第七十四课 图的遍历(BFS)

    广度优先相当于对顶点进行分层,层次遍历. 在Graph.h中添加BFS函数: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" ...