SimpleEntity
项目地址 : 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的更多相关文章
- 使用gson进行json转换
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. 示例代码如下: 实体定义 ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- Hibernate Validation使用示例及讲解
Hibernate Validation使用示例及讲解 时间 -- :: ITeye-博客 原文 http://wdmcygah.iteye.com/blog/2174680 主题 Java 在项目开 ...
- .NETCore 新型 ORM 功能介绍
简介 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+. 定义 IFre ...
- 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览
年关将至,首页技术含量文章真是越来越少,理解大家盼着放假过年,哥们我何尝不是,先给大家拜个早年. 兄弟我从11月底发了神经,开启了 ORM 功能库的开发之旅,历时两个月编码和文档整理,目前预览版本更新 ...
- 我发起并创立了一个 .Net 平台上的 Web 业务系统 基础库 开源项目 WebEasy
我 强调一点, 程序员 应该对 程序 有 控制感 . 过多的 控制反转 使 程序员 丧失了 对 程序 的 控制感 . 过多的 依赖注入 束缚了 程序员 的 创造力 . 过度复杂的 架构设计 束缚了 程 ...
- hibernate validator自定义校验注解以及基于服务(服务组)的校验
hibernate validator是Bean Validation 1.1 (JSR 349) Reference Implementation,其广泛的应用在mvc的参数校验中,尤其是使用服务端 ...
- how to use greendao in android studio
http://www.arjunsk.com/android/use-greendao-android-studio/ 1.新建一个java文件MainGenerator.java: import d ...
- greenDAO学习分享总结
greenDAO(最新版本号V2.0.0的Readme) ======== greenDAO is a light & fast ORM solution for Android that m ...
随机推荐
- dialog销毁不干净与弹出多个dialog问题
1.关闭dialog的时候不销毁.重新打开然后影响页面的效果与样式. 原因: dialog的close()只是将html片段隐藏,并没有销毁移除. 解决方式: 打开dialog的时候在写onClose ...
- python中的import,reload,以及__import__
python中的import,reload,以及__import__ 分类: UNIX/LINUX C/C++LINUX/UNIX shellpython2013-04-24 20:294536人阅读 ...
- 6.Python爬虫入门六之Cookie的使用
大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...
- golang统计出其中英文字母、空格、数字和其它字符的个数
方法一 通过ASCII码表判断并统计 package main import "fmt" func charactortype() { var s2 string = " ...
- Getting started with 3G | ip.access nano3G+OpenBSC+Osmocom-bb Part 1
English Version could be find at Osmocom.org https://osmocom.org/projects/cellular-infrastructure/wi ...
- 用Java批量重命名文件
要事先在C盘里创建“照片”和“照片1”两个文件夹 1import java.io.*; public class Jack { public static void main(String[] arg ...
- org.springframework.dao.InvalidDataAccessApiUsageException报错
2018-01-09 18:12:29,980 [qtp1501019626-21] ERROR - 外部接口调用方法[TestController$$EnhancerBySpringCGLIB$$8 ...
- 使用Sphinx为你的python模块自动生成文档
Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等. 安装 创建一个sphinx项目 下面的命令会 ...
- 网络流Dinic算法
我的模板 例题: https://vjudge.net/problem/HDU-4280 struct Edge { int lst; int from; int to; int cap; int f ...
- flask的安装
1.查看已安装的Flask版本 在 python 的交互模式中 : 1. import flask 没报错:已经安装了Flask,可以继续查看版本 报错:没安装Flask 2. flask.__ver ...