C# NPOCO 轻量级ORM框架(入门)
目前公司使用这个框架,搜不到很详细的中文资料。
只有英文wiki,所以翻译学习一下。
因为博主也是低水平的,可能会有一些理解不到位的地方。
可能会有错误的地方,如果有园友发现可以指出。
wiki地址:http://github.com/schotime/NPoco/wiki
第一个查询:
public class User
{
public int UserId { get;set; }
public string Email { get;set; }
} using (IDatabase db = new Database("connStringName"))
{
List<User> users = db.Fetch<User>("select userId, email from users");
}
注: Database 需要关闭连接(可以把它当做你的对象)。
这是通过将列名映射的属性的名称User对象。匹配不区分大小写。没有使用映射(查询)。
映射
默认情况下不需要映射。如果不指定其属性将会假设 表名 是类名,主键是“ID”。
最常用的一些基本特性映射是:
[TableName]需要一个“名称”参数,将被映射到表名。[PrimaryKey]表示表的主键列。多个键之间用逗号分隔。还有一个“增量”属性(AutoIncrement),用于指示是否将自动递增主键列例如标识列的SQL服务器。缺省为真。[Column]如果列名称不匹配的使用这种属性。[Ignore]此属性将被忽略,并且不被映射。[ResultColumn]结果列,这些属性将不被包括在插入或更新。注:需要被明确指定的SQL。它不会自动生成SQL。标记为查询或计算[ComputedColumn]标记为计算列属性,但他们将会自动生成SQL。[SerializedColumn](V3+)序列化的属性将序列化的数据的默认实现IColumnSerializer。有npoco.jsonnet库允许您使用JsonNetColumnSerializer。
demo:
[TableName("Users")]
[PrimaryKey("UserId")]
public class User
{
public int UserId { get;set; }
[Column("emailAddress")]
public string Email { get;set; }
[ResultColumn]
public string ExtraInfo { get;set; }
[Ignore]
public int Temp { get;set; }
}
查询单个对象
从数据库中查询一个对象可以几种不同方法来完成。
通过ID
最简单的方式是使用 SingleById<T>()方法。
IDatabase db = new Database("connStringName");
User u = db.SingleById<User>();
通过SQL
如果您不显式提供 字段 将自动为您生成 ,子句将随后附上。
User u = db.Single<User>("where emailaddress = @0", "email@domain.com");
or
User u = db.Single<User>("select u.* from users u where emailaddress = @0", "email@domain.com");
这两种方法都有一个“ordefault”方法。如果您不确定对象是否存在的话,请使用这些方法。如果对象不存在,而且您没有使用到 ordefault 就会引发空引用异常。
还有 First<T> 和 FirstOrDefault<T> 如果有多条数据将抛出一个异常。如果不多于1个记录将返回结果。
插入,更新,删除
插入新记录
IDatabase db = new Database("connStringName");
User u = new User()
{
Email = "name@domain.com",
LastLoggedIn = DateTime.UtcNow
};
db.Insert(u);
更新记录
var user = db.SingleById();
user.Email = "new@domain.com";
db.Update(user);
删除记录
var user = db.SingleById();
db.Delete(user);
or
db.Delete<User>();
覆盖或新建记录
IDatabase db = new Database("connStringName");
User u = new User()
{
Email = "name@domain.com",
LastLoggedIn = DateTime.UtcNow
};
db.Save(u);
这样会插入一个新记录或更新一个现有记录。它是否存在是由主键确定的。
这个语句很危险,一定要确定你的对象里没有主键或主键不在数据库中,博主曾经用这个语句错误更新了正式环境几百条数据!
查询列表
获取所有:
List<User> users = db.Fetch<User>();
标准获取:
List<User> users = db.Fetch<User>("where isActive = 1");
使用SQL:
List<User> users = db.Fetch<User>("select u.* from users where u.isActive = 1");
懒惰模式
警告:以下方法Query<T>使用生成的关键字。运行该查询的结果都j将被遍历。如果你不完全理解这一概念,请使用 Fetch<T>。
List<User> users = db.Query<User>("select u.* from users where u.isActive = 1");
查询分页
主要有两种方法用于查询分页。
Page<T>
IDatabase db = new Database("connStringName");
Page<T> pagedUsers = db.Page<User>(, , "select u.* from users u order by userid");
其中Page<T>被定义为:
public class Page<T>
{
public long CurrentPage { get; set; }
public long TotalPages { get; set; }
public long TotalItems { get; set; }
public long ItemsPerPage { get; set; }
public List<T> Items { get; set; }
}
注意:您必须在SQL语句中提供一个 order by 语句,以便查询知道您希望数据分页的顺序。
页面的第一个参数是页面编号。这个数字从第一个页面的1开始。第二个参数是页面的大小。在上面的示例中,将返回包含10个用户的第二个页面。
SkipTake<T>
SkipTake<T> 方法与在LINQ中跳过采取方法非常相似。它具有与页面< T >方法相同的参数数量,但第一个参数不是页码,而是记录的数量(即要取的记录数量?)。第二个参数是跳过x个记录之后返回的记录数(即开始的位置?)。为了返回与Page<T>方法相同的结果,查询将如下所示:
List<User> users = db.SkipTake<User>(, , "select u.* from users u order by userid");
对事务的支持
示例1
using (IDatabase db = new Database("connStringName"))
{
db.BeginTransaction();
//Your CRUD operation here
db.CompleteTransaction();
}
示例2
using (IDatabase db = new Database("connStringName"))
{
using (var transaction = db.GetTransaction())
{
//Your CRUD operation here
transaction.Complete();
}
}
翻译时间 2017/8/15
C# NPOCO 轻量级ORM框架(入门)的更多相关文章
- PetaPoco轻量级ORM框架 - 入门安装
PetaPoco 是一个开源轻量级ORM,够小,够快,单文件 在GitHub上有很高的人气 1377星,几年来作者一直在更新 当前版本6.0.317 - Netstandard 2.0(同时支持.ne ...
- C# NPOCO 轻量级ORM框架(进阶)
继续翻译NPOCO wiki. 这篇将home上 下面的几个页面翻译. wiki地址:https://github.com/schotime/NPoco/wiki 上一篇: http://www.cn ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架
Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...
- Farseer.net轻量级开源框架 入门篇:使用前说明
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 框架性能测试 下一篇:Farseer.net轻量级开源框架 入门篇: 增.删.改. ...
- Farseer.net轻量级开源框架 入门篇:逻辑层的选择
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 入门篇:增.删.改.查操作演示 下一篇:Farseer.net轻量级开源框架 入门 ...
- Farseer.net轻量级开源框架 入门篇:分类逻辑层
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 缓存逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 ...
- Farseer.net轻量级开源框架 入门篇:添加数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...
- Farseer.net轻量级开源框架 入门篇:修改数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...
随机推荐
- dropload的使用记录
这次做一个H5的页面,需要用到上拉加载,下拉刷新的功能,在网上看到ximen写的dropload.js可以满足需求(此处致谢作者),但是用的时候还是踩了一些坑,这里记录下来备忘. 一些小问题:1. m ...
- 20155303 2016-2017-2 《Java程序设计》第十周学习总结
20155303 2016-2017-2 <Java程序设计>第十周学习总结 目录 学习内容总结 网络编程 数据库 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
- 【bzoj题解】1008 越狱
题目描述 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱. 输入 输入两个整 ...
- 【逆向知识】PE ASLR
1.知识点 微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出 ASLR技术会使PE文件 ...
- html5新增表单元素
1.验证 <form> <input type="email"></input> 验证邮箱 <input type="ur ...
- sicily 1231. The Embarrassed Cryptography
Time Limit: 2sec Memory Limit:32MB Description The young and very promising cryptographer Odd Ev ...
- 15 Defer, Panic, and Recover
Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...
- python面向对象(四)之抽象类与接口
学过java的应该知道java有抽象类和接口的那么python呢?(以前写的关于java抽象类的笔记java抽象类与接口) python作为一个动态语言,没有强类型的检查,而是以鸭子类型的方式提现 ...
- 分别使用docx4j,jacob将文字与图片插入word中书签位置
项目中需要将一段文字,与人员的签名(图片)插入到上传的word中,上网查询了一下,有许多种方式可以向word中插入文字,发现docx4j与jacob都为比较常见的解决方案,于是就先使用的docx4j进 ...
- KMP模板及总结
KMP是一种字符串匹配算法,它在时间复杂度上较暴力匹配算法由很大的优势.比如我要找字符串S中是否存在子串P,如果暴力匹配的话,则时间复杂度为O(n*m),而kmp算法时间复杂度为O(n+m). 这里我 ...