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 (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.…

1 month 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ı…

5 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…

1 year 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ı…

1 year 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…

1 year ago

Some Awesome News of .NET 7

{:tr}Bildiğimiz gibi .NET Conf 2022, 8-10 kasım arasında gerçekleşti. Konferans sırasında ise .NET 7 ve…

1 year ago