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
* Ş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.
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
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();
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();
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"
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(); }
`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 |
{:tr} Makalenin ilk bölümünde, Software Supply Chain güvenliğinin öneminden ve containerized uygulamaların güvenlik risklerini azaltabilmek…
{: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.…
{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…
{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…
{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…
{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…