Micro ORMs, alternatives to Entity Framework ? Part 3

 

<< Previous article (Part 2)

Introduction of some Micro ORMs: Massive

Scenario Used

You can find the scenario used in a last article here.

Massive

  • Provide only dynamic data
  • Compatible with few relational databases: SQL Server, Oracle, SqlLite, PostgreSql
  • Dual SQL Syntax and LINQ / SQL Hybrid
  • Provides basic commands only, simplistic syntax (no join for example)
  • Interesting performances
  • Provide Async queries
  • Supports transactions
  • Mandatory to create an AdHoc query to populate an object (relationships are not supported)
  • Mandatory to inherit its Pocos from a class called DynamicModel (Map its data into another similar typed object or be satisfied with dynamic data)
  • Not compatible with .NET Core
  • No NuGet package, download two files on the GitHub repo
  • Not testable unitarily

Code samples :

Required entities and business objects for our scenario :

public class OrdersDynamic : DynamicModel
    {
        public OrdersDynamic() : base("AdventureWorks2014", "Production.WorkOrder", "WorkOrderID") { }

        public int Id { get; set; }
        public string ProductName { get; set; }
        public int Quantity { get; set; }
        public DateTime Date { get; set; }
    }

    public class WorkOrderDynamic : DynamicModel
    {
        public WorkOrderDynamic() : base("AdventureWorks2014", "Production.WorkOrder", "WorkOrderID") { }

        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 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 class Orders
    {
        public Orders() { }

        public int Id { get; set; }
        public string ProductName { get; set; }
        public int Quantity { get; set; }
        public DateTime Date { get; set; }
    }

Repository sample :

public class MassiveRepository
    {
        public List GetOrders()
        {
            var table = new OrdersDynamic();

            return table.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").Select(x => new Orders {
                                                                                                                                Id = x.Id,
                                                                                                                                ProductName = x.ProductName,
                                                                                                                                Quantity = x.Quantity,
                                                                                                                                Date = x.Date
                                                                                                                            }).ToList();
        }

        public Orders GetOrderById(int id)
        {
            var table = new OrdersDynamic();

            var data =  table.Query(@"SELECT  [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
                                     WHERE WorkOrderID = @0", id).FirstOrDefault();

            return new Orders
            {
                Id = data.Id,
                ProductName = data.ProductName,
                Quantity = data.Quantity,
                Date = data.Date
            };
        }

        public void Add(WorkOrder workOrder)
        {
            var table = new WorkOrderDynamic();
            table.Insert(workOrder);
        }

        public void Update(WorkOrder workOrder)
        {
            var table = new WorkOrderDynamic();
            table.Update(workOrder, "WHERE WorkOrderID = @0", workOrder.WorkOrderId.ToString());
        }
        public void Delete(WorkOrder workOrder)
        {
            var table = new WorkOrderDynamic();
            table.Delete("WHERE WorkOrderID = @0",  workOrder.WorkOrderId.ToString());
        }
    }

Pretty but heavy to use with its DynamicModel isn’t it? 🙂

 

Now let’s talk about PetaPoco.