İçeriğe geç

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
Kategori:ORM

Tek Yorum

  1. Veysel Veysel

    Teşekkürler çok güzel bir paylaşım orm geliştirme hakkında fazla bir kaynak bulunamıyordu Türkçe olarak. Bu çok iyi bir örnek olacak üstat.

Bu yazı yorumlara kapalı, ama geri izlemeler ve pingback'ler açık.