首页 > 代码库 > PetaPoco 笔记

PetaPoco 笔记

PetaPoco是一款适用于.Net 和Mono的微小、快速、单文件的微型ORM。

PetaPoco有以下特色:

  • 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中。
  • 工作于严格的没有装饰的Poco类,和几乎全部加了特性的Poco类
  • Insert/Delete/Update/Save and IsNew 等帮助方法。
  • 分页支持:自动得到总行数和数据
  • 支持简单的事务
  • 更好的支持参数替换,包括从对象属性中抓取命名的参数。
  • 很好的性能,剔除了Linq,并通过Dynamic方法快速的为属性赋值
  • T4模板自动生成Poco类
  • 查询语言是Sql……不支持别扭的fluent或Linq语法(仁者见仁,智者见智)
  • 包含一个低耦合的Sql Builder类,让内联的Sql更容易书写
  • 为异常信息记录、值转换器安装和数据映射提供钩子。(Hooks for logging exceptions, installing value converters and mapping columns to properties without attributes.)
  • 兼容SQL Server, SQL Server CE, MySQL, PostgreSQL and Oracle。
  • 可以在.NET 3.5 或Mono 2.6或更高版本上运行
  • 在.NET 4.0 和Mono 2.8下支持dynamic
  • NUnit单元测试
  • 开源(Apache License)
  • 所有功能大约用了1500行代码

 

可以从这里获得PetaPoco:

  • NuGet - http://nuget.org/List/Packages/PetaPoco
  • GitHub - https://github.com/toptensoftware/petapoco

 

创建PetaPoco对象,并执行查询:

// Create a PetaPoco database object
var db=new PetaPoco.Database("connectionStringName");

// Show all articles    
foreach (var a in db.Query<article>("SELECT * FROM articles"))
{
    Console.WriteLine("{0} - {1}", a.article_id, a.title);
}

  得到一个scalar:

long count=db.ExecuteScalar<long>("SELECT Count(*) FROM articles");

  得到一行记录:

var a = db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123));

获取分页数据(将获取一个PageFetch对象):

  PetaPoco分页执行过程:

var result=db.Page<article>(1, 20, // <-- page number and items per page
        "SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");

    1.生成并执行一个查询,获取匹配的数据行数。

    2.修改原始的查询语句,只能得到所有匹配的一个子集。

    pageFetch对象:一个展示单页数据和分页控制的类。

public class Page<T> where T:new()
{
    public long CurrentPage { get; set; }
    public long ItemsPerPage { get; set; }
    public long TotalPages { get; set; }
    public long TotalItems { get; set; }
    public List<T> Items { get; set; }
}

获取数据的方式Query 和 Fetch:

  Fetch返回一个一个POCO类的List<>,而Query使用迭代所有数据,但是这些数据没有被加载到内存中。 

  不带查询的命令:

db.Execute("DELETE FROM articles WHERE draft<>0");

  Inserts、Updates 和 Deletes:

// Create the article
var a=new article();
a.title="My new article";
a.content="PetaPoco was here";
a.date_created=DateTime.UtcNow;

// Insert it
db.Insert("articles", "article_id", a);

// by now a.article_id will have the id of the new article
// Get a record
var a=db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123);

// Change it
a.content="PetaPoco was here again";

// Save it
db.Update("articles", "article_id", a);
db.Update("articles", "article_id", new { title="New title" }, 123);
// Delete an article extracting the primary key from a record
db.Delete("articles", "article_id", a);

// Or if you already have the ID elsewhere
db.Delete("articles", "article_id", null, 123); 

修饰POCO类:

// Represents a record in the "articles" table
[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
public class article
{
    public long article_id { get; set; }
    public string title { get; set; }
    public DateTime date_created { get; set; }
    public bool draft { get; set; }
    public string content { get; set; }
} 

  简化后的insert、update、delete:

// Insert a record
var a=new article();
a.title="My new article";
a.content="PetaPoco was here";
a.date_created=DateTime.UtcNow;
db.Insert(a);

// Update it
a.content="Blah blah";
db.Update(a);

// Delete it
db.Delete(a);

  delete和update的其它方式:

// Delete an article
db.Delete<article>("WHERE article_id=@0", 123);

// Update an article
db.Update<article>("SET title=@0 WHERE article_id=@1", "New Title", 123);

  忽略某列:

public class article
{
    [PetaPoco.Ignore]
    public long SomeCalculatedFieldPerhaps
    { 
        get; set; 
    }
}

  使用类和列的属性来指明哪些列需要映射:

// Represents a record in the "articles" table
[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
[PetaPoco.ExplicitColumns]
public class article
{
    [PetaPoco.Column]publiclong article_id { get; set;}
    [PetaPoco.Column]publicstring title { get; set;}
    [PetaPoco.Column]publicDateTime date_created { get; set;}
    [PetaPoco.Column]public bool draft { get; set;}
    [PetaPoco.Column]publicstring content { get; set;}
} 

T4 模板:

  • PetaPoco.Core.ttinclude - includes all the helper routines for reading the DB schema(数据库模式)
  • PetaPoco.Generator.ttinclude - the actual template that defines what‘s generated(实体模板)
  • Database.tt - the template itself that includes various settings and includes the two other ttinclude files.(模板本身)

  use the template:

  1. Add the three files to you C# project
  2. Make sure you have a connection string and provider name set in your app.config or web.config file
  3. Edit ConnectionStringName property in Records.tt (ie: change it from "jab" to the name of your connection string)
  4. Save Database.tt.

自动的Select语句:

  运行一个不以select开头的查询, PetaPoco会自动的将它加上。

IsNew 和Save 方法:

  IsNew:检测是否为新增。

  Save:根据判断的结果执行Insert或Update。

事务:

using (var scope=db.Transaction)
{
    // Do transacted updates here

    // Commit
    scope.Complete();
}

注意:为了使用事务,所有操作都需要相同的PetaPoco Database对象实例。

 

 

PetaPoco 笔记