zoukankan      html  css  js  c++  java
  • 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”。

    最常用的一些基本特性映射是:

    1. [TableName]需要一个“名称”参数,将被映射到表名。

    2. [PrimaryKey]表示表的主键列。多个键之间用逗号分隔。还有一个“增量”属性(AutoIncrement),用于指示是否将自动递增主键列例如标识列的SQL服务器。缺省为真。

    3. [Column]如果列名称不匹配的使用这种属性。

    4. [Ignore]此属性将被忽略,并且不被映射。

    5. [ResultColumn]标记为查询或计算结果列,这些属性将不被包括在插入或更新。注:需要被明确指定的SQL。它不会自动生成SQL。

    6. [ComputedColumn]标记为计算列属性,但他们将会自动生成SQL。

    7. [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



    转载请标明出处

    作者:AaXuan

    地址:http://www.cnblogs.com/Aaxuan

    知识共享许可协议

    本作品采用  知识共享署名 3.0 未本地化版本许可协议  进行许可。

  • 相关阅读:
    Vue-cli / webpack 加载静态js文件的方法
    shell curl 下载图片并另存为(重命名)
    sublime 技巧与快捷键篇
    es5 温故而知新 创建私有成员、私有变量、特权变量的方法
    es5 温故而知新 简单继承示例
    js 万恶之源 是否滚动到底部?
    ES6 基础知识
    jquery操作select(取值,设置选中)
    WebApi深入学习--特性路由
    Asp.net 代码设置兼容性视图
  • 原文地址:https://www.cnblogs.com/Aaxuan/p/7366476.html
Copyright © 2011-2022 走看看