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