Micro ORMs, alternatives to Entity Framework ? Part 4
Introduction of some Micro ORMs: PetaPoco
Scenario Used
You can find the scenario used in a last article here.
PetaPoco
- “Inspired” of Massive, probably a fork of this latter
- Compatible with databases: SQL Server, Oracle, SqlLite, PostgreSql, MySQL, FireBird
- Triple SQL Syntax, LINQ-Like and LINQ / SQL Hybrid
- Interesting performances
- Active Community
- No need to create an AdHoc query to populate an object (relationships are supported)
- Supports .Net Core
- Supports transactions
- Testable unitarily
- Insert, Update, Delete identical to Massive
- Mandatory to add mapping attributes if aliases are used in the SQL query ([Column])
- Doesn’t provide Async queries
Code samples :
Required entities and business objects for our scenario :
[ExplicitColumns] public class Orders { public Orders() { } [Column] public int Id { get; set; } [Column] public string ProductName { get; set; } [Column] public int? Quantity { get; set; } [Column] public DateTime? Date { get; set; } } //Db entity public class WorkOrder { public WorkOrder() { } public int WorkOrderId { get; set; } public int ProductID { get; set; } public int? OrderQty { get; set; } public int? StockedQty { get; set; } public int? ScrappedQty { get; set; } public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } public DateTime? DueDate { get; set; } public int? ScrapReasonID { get; set; } public DateTime? ModifiedDate { get; set; } public Product Product { get; set; } } //Db entity public class Product { public int ProductID { get; set; } public string Name { get; set; } }
Repository sample :
public class PetaPocoRepository { public PetaPocoRepository() { } public List GetOrders() { using (var db = new PetaPoco.Database("AdventureWorks2014")) { return db.Query(@"SELECT TOP 500 [WorkOrderID] AS Id, P.Name AS ProductName, [OrderQty] AS Quantity, [DueDate] AS Date FROM [AdventureWorks2014].[Production].[WorkOrder] AS WO INNER JOIN[Production].[Product] AS P ON P.ProductID = WO.ProductID").ToList(); return GetWorkOrdersWithProduct(db) .Select(x=> new Orders { Id = x.WorkOrderId, Date = x.DueDate, Quantity = x.OrderQty, ProductName = x.Product.Name }).ToList(); } } public List GetWorkOrdersWithProduct() { using (var db = new PetaPoco.Database("AdventureWorks2014")) { return GetWorkOrdersWithProduct(db); } } private List GetWorkOrdersWithProduct(Database db) { return db.Fetch<WorkOrder, Product>(@"SELECT TOP 500 WO.*, P.* FROM [AdventureWorks2014].[Production].[WorkOrder] AS WO INNER JOIN[Production].[Product] AS P ON P.ProductID = WO.ProductID").ToList(); } }
Interesting isn’t it? 🙂