This is the final part of a 3-part series comparing micro-ORMs. We’ve already seen Dapper and Massive. Now it’s time for PetaPoco.
PetaPoco
Website: http://www.toptensoftware.com/petapoco/
Code: https://github.com/toptensoftware/petapoco
NuGet: http://nuget.org/packages/PetaPoco
Databases supported: SQL Server, SQL Server CE, Oracle, PostgreSQL, MySQL
Size: 2330 lines of code
Description
PetaPoco was, like the website states, “inspired by Rob Conery’s Massive project but for use with non-dynamic POCO objects.” A couple of the more notable features include T4 templates to automatically generate POCO classes, and a low-friction SQL builder class
Installation
There are two packages available to install: Core Only and Core + T4 Templates. I chose the one with templates, which raises a dialog with the following message:
“Running this text template can potentially harm your computer. Do not run it if you obtained it from an untrusted source.”
PetaPoco has a click-to-accept Apache License. If your project is a console application, you’ll need to add an App.config file.
Usage
Because PetaPoco uses POCOs, it looks more like Dapper than Massive at first glance:
class Product { public int ProductId { get; set; } public string ProductName { get; set; } } class Program { private static void Main(string[] args) { var db = new Database("northwind"); var products = db.Query("SELECT * FROM Products"); } }
There is also experimental support for “dynamic” queries if you need them:
var products = db.Query("SELECT * FROM Products");
PetaPoco has a lot of cool features, including paged fetches (a wheel I’ve reinvented far too many times):
var pagedResult = db.Page(sql: "SELECT * FROM Products", page: 2, itemsPerPage: 20); foreach (var product in pagedResult.Items) { Console.WriteLine("{0} - {1}", product.ProductId, product.ProductName); }
While POCOs give you the benefit of static typing, and System.Dynamic frees you from the burden of defining all your objects by hand, templates attempt to give you the best of both worlds.
The first thing you have to do the use templates is ensure that your connection string has a provider name. Otherwise the code generator will fail. Then you must configure the Database.tt file. I changed the following lines:
ConnectionStringName = "northwind"; // Uses last connection string in config if not specified Namespace = "Northwind";
When you save it, you might get a security warning because Visual Studio is about to generate code from the template. You can dismiss the warning if you haven’t already.
Now you can use the generated POCOs in your code:
var products = Northwind.Product.Query("SELECT * FROM Products");
First Impressions
PetaPoco is surprisingly full-featured for a micro-ORM while maintaining a light feel and small code size. There is too much to show in a single blog post, so you should check out the PetaPoco website for a full description of what this tool is capable of.
Final Comparison
All of these micro-ORMs fill a similar need, which is to replace a full-featured ORM with something smaller, simpler, and potentially faster. That said, each one has its own strengths and weaknesses. Here are my recommendations based on my own limited testing.
You should consider… | If you’re looking for… |
Dapper | Performance, proven stability |
Massive | Tiny size, flexibility |
PetaPoco | POCOs without the pain, more features |