C# NPOCO 轻量级ORM框架(入门)
目前公司使用这个框架,搜不到很详细的中文资料。
只有英文wiki,所以翻译学习一下。
因为博主也是低水平的,可能会有一些理解不到位的地方。
可能会有错误的地方,如果有园友发现可以指出。
wiki地址:http://github.com/schotime/NPoco/wiki
第一个查询:
1 public class User 2 { 3 public int UserId { get;set; } 4 public string Email { get;set; } 5 } 6 7 using (IDatabase db = new Database("connStringName")) 8 { 9 List<User> users = db.Fetch<User>("select userId, email from users"); 10 }
注: Database
需要关闭连接(可以把它当做你的对象)。
这是通过将列名映射的属性的名称User
对象。匹配不区分大小写。没有使用映射(查询)。
映射
默认情况下不需要映射。如果不指定其属性将会假设 表名 是类名,主键是“ID”。
最常用的一些基本特性映射是:
-
[TableName]
需要一个“名称”参数,将被映射到表名。 -
[PrimaryKey]
表示表的主键列。多个键之间用逗号分隔。还有一个“增量”属性(AutoIncrement),用于指示是否将自动递增主键列例如标识列的SQL服务器。缺省为真。 -
[Column]
如果列名称不匹配的使用这种属性。 -
[Ignore]
此属性将被忽略,并且不被映射。 -
[ResultColumn]
结果列,这些属性将不被包括在插入或更新。注:需要被明确指定的SQL。它不会自动生成SQL。标记
为查询或计算 -
[ComputedColumn]标记为
计算列属性,但他们将会自动生成SQL。 -
[SerializedColumn]
(V3+)序列化的属性将序列化的数据的默认实现IColumnSerializer
。有npoco.jsonnet库允许您使用JsonNetColumnSerializer
。
demo:
1 [TableName("Users")] 2 [PrimaryKey("UserId")] 3 public class User 4 { 5 public int UserId { get;set; } 6 [Column("emailAddress")] 7 public string Email { get;set; } 8 [ResultColumn] 9 public string ExtraInfo { get;set; } 10 [Ignore] 11 public int Temp { get;set; } 12 }
查询单个对象
从数据库中查询一个对象可以几种不同方法来完成。
通过ID
最简单的方式是使用 SingleById<T>()
方法。
1 IDatabase db = new Database("connStringName"); 2 User u = db.SingleById<User>(3);
通过SQL
如果您不显式提供 字段 将自动为您生成 ,子句将随后附上。
1 User u = db.Single<User>("where emailaddress = @0", "email@domain.com"); 2 or 3 User u = db.Single<User>("select u.* from users u where emailaddress = @0", "email@domain.com");
这两种方法都有一个“ordefault”方法。如果您不确定对象是否存在的话,请使用这些方法。如果对象不存在,而且您没有使用到 ordefault 就会引发空引用异常。
还有 First<T>
和 FirstOrDefault<T>
如果有多条数据将抛出一个异常。如果不多于1个记录将返回结果。
插入,更新,删除
插入新记录
1 IDatabase db = new Database("connStringName"); 2 User u = new User() 3 { 4 Email = "name@domain.com", 5 LastLoggedIn = DateTime.UtcNow 6 }; 7 8 db.Insert(u);
更新记录
1 var user = db.SingleById(1); 2 user.Email = "new@domain.com"; 3 db.Update(user);
删除记录
1 var user = db.SingleById(1); 2 db.Delete(user); 3 or 4 db.Delete<User>(1);
覆盖或新建记录
1 IDatabase db = new Database("connStringName"); 2 User u = new User() 3 { 4 Email = "name@domain.com", 5 LastLoggedIn = DateTime.UtcNow 6 }; 7 8 db.Save(u);
这样会插入一个新记录或更新一个现有记录。它是否存在是由主键确定的。
这个语句很危险,一定要确定你的对象里没有主键或主键不在数据库中,博主曾经用这个语句错误更新了正式环境几百条数据!
查询列表
获取所有:
1 List<User> users = db.Fetch<User>();
标准获取:
1 List<User> users = db.Fetch<User>("where isActive = 1");
使用SQL:
1 List<User> users = db.Fetch<User>("select u.* from users where u.isActive = 1");
懒惰模式
警告:以下方法Query<T>
使用生成的关键字。运行该查询的结果都j将被遍历。如果你不完全理解这一概念,请使用 Fetch<T>
。
1 List<User> users = db.Query<User>("select u.* from users where u.isActive = 1");
查询分页
主要有两种方法用于查询分页。
Page<T>
1 IDatabase db = new Database("connStringName"); 2 Page<T> pagedUsers = db.Page<User>(2, 10, "select u.* from users u order by userid");
其中Page<T>
被定义为:
1 public class Page<T> 2 { 3 public long CurrentPage { get; set; } 4 public long TotalPages { get; set; } 5 public long TotalItems { get; set; } 6 public long ItemsPerPage { get; set; } 7 public List<T> Items { get; set; } 8 }
注意:您必须在SQL语句中提供一个 order by 语句,以便查询知道您希望数据分页的顺序。
页面的第一个参数是页面编号。这个数字从第一个页面的1开始。第二个参数是页面的大小。在上面的示例中,将返回包含10个用户的第二个页面。
SkipTake<T>
SkipTake<T> 方法与在LINQ中跳过采取方法非常相似。它具有与页面< T >方法相同的参数数量,但第一个参数不是页码,而是记录的数量(即要取的记录数量?)。第二个参数是跳过x个记录之后返回的记录数(即开始的位置?)。为了返回与Page<T>方法相同的结果,查询将如下所示:
1 List<User> users = db.SkipTake<User>(10, 10, "select u.* from users u order by userid");
对事务的支持
示例1
1 using (IDatabase db = new Database("connStringName")) 2 { 3 db.BeginTransaction(); 4 //Your CRUD operation here 5 db.CompleteTransaction(); 6 }
示例2
1 using (IDatabase db = new Database("connStringName")) 2 { 3 using (var transaction = db.GetTransaction()) 4 { 5 //Your CRUD operation here 6 transaction.Complete(); 7 } 8 }
翻译时间 2017/8/15