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 ...
随机推荐
- Web开发框架DevExtreme发布v18.2.5|附下载
DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动.Web开发框架,可以直接在Visual Studio集成开发环境,构建 ...
- JAVA 中的MessageDigest类和Mac类的使用
MessageDigest 消息摘要 例子: MD5加密: try{ MessageDigest md5 = MessageDigest.getInstance("MD5"); m ...
- Join Algorithm
Join(SQL) An SQL join clause combines columns from one or more tables in a relational database. It c ...
- day 关于生成器的函数
def average(): count=0 toatal=0 average=0 while True: value=yield average toatal+=value count+=1 ave ...
- mysql cast
之前讲到了orcale的字符串与日期等类型的转换,现在我们来看看Mysql是怎么转换的.比起orcale,MySQL相比之下就简单得多了,只需要一个Cast()函数就能搞定.其语法为:Cast(字段名 ...
- python scrapy 数据处理时间格式转换
def show(self,response): # print(response.url) title = response.xpath('//main/div/div/div/div/h1/tex ...
- 1--Python 入门--Python基础数据类型
一.Python基础语法 初次使用Python,首先要明确三点: Python的标识符(例如变量名.函数名等),可用字母.数字和下划线构成,不能以数字开头,且区分大小写. Python对于缩进敏感.在 ...
- Linux大文件分割splite
/********************************************************************** * Linux大文件分割splite * 说明: * 编 ...
- dubbo AdaptiveExtension
AdaptiveExtension 自适应Extension,作者其实在使用Extension方和Extension之间插入AdaptiveExtension用来自适应,也可以说是适配. 所以,我们发 ...
- hello1.java内容简单介绍
双击该Hello.java文件以查看它. 在Hello类,称为管理bean类,提供了getter和setter方法name中的Facelets页面表达式中使用属性.默认情况下,表达式语言引用类名,第一 ...