Categories: ORM

Goo Micro ORM

Goo Micro ORM .Net için geliştirilmiş strongly typed destekli, code-first yaklaşımlı basit bir açık kaynak kodlu orm aracıdır.

Link: https://github.com/GokGokalp/Goo-Micro-ORM

# DESTEKLERİ

* Şuan sadece MSSQL veritabanını desteklemektedir.
* Veri modelinizi code-first yaklaşımı ile oluşturmanıza olanak sağlamaktadır.
* Basit tablo işlemlerini gerçekleştirebilmenizi sağlamaktadır.
* Listeleme işlemlerini type destekli bir şekilde yapabilmenizi sağlamaktadır.
* LINQ kullanımına olanak sağlamaktadır.
* Caching işlemlerini desteklemektedir.
* Transaction işlemlerini desteklemektedir.
* Custom kompleks query yazabilmeye olanak sağlamaktadır.

# KULLANIMI

Goo Micro ORM’i projenize ekleyip ilgili connection ayarlarını tanımladıktan sonra kendi modelinizi oluşturmaya hemen başlayabilirsiniz. UnitTest ortamı için “GooNorthwind.sql” script’ini çalıştırmanız yeterlidir.

Typed desteğini kullanabilmeniz için:
* Kendi entitylerinizi ModelBase soyut sınıfından türetin.
* GooContext sınıfının üretilebilmesi için GooContext.tt şablonu içindeki “YOUR INFRASTRUCTURE LAYER PATH” ve “YOUR MODEL LAYER PATH” alanlarını güncellemeniz gerekmektedir.
* Kendi projeniz için ise GooContext.tt sınıfını ilgili model katmanınız ile aynı yerde barındırmanız yeterlidir.

Propertyleri veritabanı tarafında eşleyebilmek için:
* Entitylerinizi ilgili type attributeleri ile işaretleyin.

Categories entitysi için örnek bir model tanımlaması:

using Goo.Attributes;
using Goo.OrmCore;

namespace Goo.UnitTest.Entities
{
public class Categories : ModelBase
{
[IsPrimaryKey]
[IsAutoIncrement(1, 1)]
public int CategoryID { get; set; }

[NVARCHAR(15)]
[NOTNULL]
public string CategoryName { get; set; }

[NTEXT]
[NULL]
public string Description { get; set; }

[IMAGE]
[NULL]
public byte[] Picture { get; set; }
}
}

Desteklenen tipler: BOOLEAN, DATETIME, DECIMAL, IMAGE, INT, IsAutoIncrement, IsForeignKey, IsPrimaryKey, IsRelationEntity, MONEY, NCHAR, NONCLUSTEREDINDEX, NOTNULL, NTEXT, NULL, NVARCHAR, SMALLINT, TINYINT, VARCHAR

Veritabanı Modelleme

Entitylerinizi ModelBase soyut sınıfından türeterek oluşturduktan sonra projeyi derlediğinizde Goo Micro ORM size GooContext wrapper sınıfını oluşturacaktır.

DBInitializerManager dbInitializerManager = DBInitializerManager.getInstance;

dbInitializerManager.InitializeDatabase();


Create/Alter/Drop/Truncate İşlemleri

Tablo üzerindeki işlemlerinizi kolaylıkla DBInitializerManager üzerinden gerçekleştirebilirsiniz.

DBInitializerManager dbInitializerManager = DBInitializerManager.getInstance;

dbInitializerManager.DropTable();
dbInitializerManager.CreateOrAlterTable();
dbInitializerManager.TruncateTable();

CRUD İşlemleri

GooContext sınıfı üzerinden insert/update ve delete işlemlerinizi yapabilirsiniz.

Entity ekleme:

GooContext gooContext = new GooContext();

Categories category = new Categories()
{
CategoryName = "Computer",
Description = "Insert test"
};

gooContext.Categories.Insert(category);

int result = gooContext.SubmitChanges();


Entity güncelleme:

GooContex gooContext = new GooContext();

Categories category = gooContext.Categories.FirstOrDefault();

category.CategoryName = "Computer Update";
category.Description = "Update test";

gooContext.Categories.Update(category);

int result = gooContext.SubmitChanges();


Entity silme:

GooContex gooContext = new GooContext();

Categories category = gooContext.Categories.FirstOrDefault();

gooContext.Categories.Delete(category);

int result = gooContext.SubmitChanges();

 

Read İşlemleri

GooContext sınıfı üzerinden listeleme, getirme ve ön belleğe ekleme gibi işlemleri yapabilirsiniz.

FirstOrDefault:

GooContext gooContext = new GooContext();

Orders order = gooContext.Orders.Where(x=>x.RequiredDate == DateTime.Now).FirstOrDefault();


ToList:

GooContext gooContext = new GooContext();

List orders = gooContext.Orders.ToList();


Where:

GooContext gooContext = new GooContext();

List orders = gooContext.Orders.Where(o => o.OrderDate > DateTime.Parse("1997-12-31") && o.ShipCountry == "Brazil").ToList();


Order ve Take:

GooContext gooContext = new GooContext();

List orders = gooContext.Orders.Where(o => o.OrderDate > DateTime.Parse("1997-12-31") && o.ShipCountry == "Brazil").OrderByAscending(x => x.OrderID).Take(5).ToList();


Custom inline query:

GooContext gooContext = new GooContext();

var orders = gooContext.ExecuteCustomQuery(@"SELECT * FROM Orders
WHERE ShipCountry = 'Brazil' AND ShipVia = 3");


AddToCache ve GetFromCache:

GooContext gooContext = new GooContext();

// Nesneyi önbelleğe varsayılan olarak limitsiz eklemeyi sağlar.
List ordersUntimed = gooContext.Orders.Where(o => o.OrderDate > DateTime.Parse("1997-12-31") && o.ShipCountry == "Brazil").AddToCache("AddToCacheUntimed").ToList();

// Nesneyi önbelleğe belirlenen bir tarih boyunca eklemeyi sağlar.
List ordersTimed = gooContext.Orders.Where(o => o.OrderDate > DateTime.Parse("1997-12-31") && o.ShipCountry == "Brazil").AddToCache("AddToCacheTimed", CacheManager.EExpirationType.Expiration, new DateTime(2015, 6, 10)).ToList();

// Nesneyi önbelleğe belirlenen bir süre boyunca eklemeyi sağlar.
List ordersSlidingTimed = gooContext.Orders.Where(o => o.OrderDate > DateTime.Parse("1997-12-31") && o.ShipCountry == "Brazil").AddToCache("AddToCacheSlidingTimed", CacheManager.EExpirationType.SlidingExpiration, new TimeSpan(1, 0, 0)).ToList();

// GetFromCache kullanarak daha önceden önbelleğe eklemiş olduğunuz nesneye erişmenizi sağlar. Nesne bulunamaması durumunda geriye null dönmektedir.
List ordersGetFromCacheUntimed = gooContext.Orders.GetFromCache("AddToCacheUntimed"); // "AddToCacheTimed" or "AddToCacheSlidingTimed"

 

ORM Configuration

OrmConfiguration özelliği size “LazyLoading, Connection ve Transaction” işlemleri yapabilmenizi sağlar.

LazyLoading:

GooContex gooContext = new GooContext();

// Lazy loading etkinleştirildiğinde, ilişkilendirilen nesneler navigation bir property üzerinden erişilmeye çalışıldığında yüklenecektir. (varsayılan false)
gooContext.OrmConfiguration.LazyLoadingEnabled = true;

Orders order = gooContext.Orders.FirstOrDefault();
order.Customer...?


Connection:

GooContex gooContext = new GooContext();

// Connection'a erişmeniz gereken durumlarda bağlantıyı sizin açmanız gerekmektedir.  
var connection = gooContext.OrmConfiguration.Connection; // .Open();


Transaction:

GooContex gooContext = new GooContext();

using (var transaction = gooContext.OrmConfiguration.Connection.BeginTransaction())
{
// Transaction nesnesini orm'e kullanacağımızı belirtmeliyiz.
gooContext.OrmConfiguration.UseTransaction(transaction);

Categories category = gooContext.Categories.FirstOrDefault();

category.Description = string.Format("{0} Updated", category.Description);

gooContext.Categories.Update(category);

int result = gooContext.SubmitChanges();

if (result > -1)
transaction.Commit();
else
transaction.Rollback();
}

 

# PERFORMANS TESTİ

`Select işlemleri için performans testi (strongly typed)`

Metot Süre Adet
ToList() 116ms 500
Where(o => o.ShipVia == 3 && o.RequiredDate > DateTime.Parse(“1996-09-01”)) 130ms 246
Where(o => o.ShipName.Contains(“al”)) 95ms 87

`Select işlemleri için performans testi (non-typed DBDataReader)`

Metot Süre Adet
ExecuteCustomQuery 76ms 500
ExecuteCustomQuery(“SELECT * FROM Orders WHERE ShipVia = 3 AND RequiredDate > ‘1996-09-01′”) 80ms 246
ExecuteCustomQuery(“SELECT * FROM Orders WHERE ShipName LIKE ‘%al%'”) 78ms 87
Gökhan Gökalp

Recent Posts

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Policy Enforcement-Automated Governance with OPA Gatekeeper and Ratify) – Part 2

{:tr} Makalenin ilk bölümünde, Software Supply Chain güvenliğinin öneminden ve containerized uygulamaların güvenlik risklerini azaltabilmek…

5 months ago

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Security Scanning, SBOMs, Signing&Verifying Artifacts) – Part 1

{:tr}Bildiğimiz gibi modern yazılım geliştirme ortamında containerization'ın benimsenmesi, uygulamaların oluşturulma ve dağıtılma şekillerini oldukça değiştirdi.…

8 months ago

Delegating Identity & Access Management to Azure AD B2C and Integrating with .NET

{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…

12 months ago

How to Order Events in Microservices by Using Azure Service Bus (FIFO Consumers)

{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…

2 years ago

Providing Atomicity for Eventual Consistency with Outbox Pattern in .NET Microservices

{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…

2 years ago

Building Microservices by Using Dapr and .NET with Minimum Effort – 02 (Azure Container Apps)

{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…

2 years ago