Herkese merhaba, bu aralar fazla boş zamanım olduğu için kişisel arge (araştırma geliştirme) çalışmalarıma ağırlık veriyorum bu çalışmalarımdan bir tanesi de SQLite veritabanı sistemini daha etkin ve modern projelere uyumlu şekilde kullanabilmenin yollarını araştırmaktı. Elbette bir veritabanını uygulama ile etkin kullanabilmenin yolu ORM (Object Relational Mapping) kavramını desteklemesi olduğundan kurcaladığım ilk şey de SQLite’ı Entity Framework ile kullanabilmekti. Neden SQLite? diyecek olursak; Küçük çaplı, veritabanı işlemleri çok yoğun olmayan ya da test amaçlı projeleriniz için SQLite bulunmaz bir nimettir. Kullanımı oldukça basittir ihtiyacınız olan sadece bir veritabanı ve System.Data.Sqlite.dll dosyalarıdır harici olarak bilgisayarınına bir program, sunucu vs. kurmanız gerekmez. Bu konuyu daha detaylı anlattığım SQLite Nedir ? Kurulumu ve Kullanımı isimli makalemi okuyabilir ve daha fazla bilgi almak için resmi sitesine buradan ulaşabilirsiniz.
Tüm bunlara rağmen sqlite ile entity framework kullanabilmek için tahmin ettiğimden daha fazla araştırma yapmak zorunda kaldım çünkü incelediğim makalelerdeki yöntemler versiyon farkından dolayı bir türlü çalışmıyordu neyse ki günün sonunda istediğim şeyi başardım ve türkçe kaynaklarda bulamadığım bu bilgiyi türkçe olarak paylaşmak istedim.
Örneğimiz bir Console uygulaması olacak fakat aynı şeyleri Web uygulamasında da yapabilirsiniz tek farkı app.config değil de web.config dosyası ile çalışmanız olacaktır. İlk olarak projenize Nuget Package Manager aracılığı ile System.Data.SQLite kütüphanesini ekleyin ya da Install-Package System.Data.SQLite komutunu çalıştırın. Ardından SQLite veritabanı dosyanızı oluşturun buradaki önemli nokta; eğer bir sqlite management programı ile oluşturuyorsanız entity framework’de bazı hatalar alabilirsiniz çünkü bazı programlarda tablolara gerekli değerleri veremiyorsunuz örneğin ID sütununa Unique özelliğini tanımlamazsanız hata alabilirsiniz bu sebeple Sql komutları ile aşağıdaki gibi tablo oluşturun
CREATE TABLE Product ( ID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, Name VARCHAR NOT NULL, Price DOUBLE NOT NULL, Category INTEGER NOT NULL );
Diğer bir önemli nokta; SQLite kütüphanesini kurduğunuzda app.config dosyanızda provider bilgileri otomatik olarak eklenecektir bu bilgiler entity framework ile uyumlu olmadığı için yine hata alabilirsiniz. Bu bilgileri temizleyin ve dosyanın son hali aşağıdaki gibi olsun
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
Ardından app.config dosyasında olması gereken bu bilgileri uygulama içerisinde yazmak için aşağıdaki SQLiteConfiguration.cs sınıfını projenize ekleyin.
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Core.Common; using System.Data.SQLite; using System.Data.SQLite.EF6; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SQLiteWithEF { public class SQLiteConfiguration : DbConfiguration { public SQLiteConfiguration() { SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance); SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance); SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices))); } } }
Şimdi Product.cs model sınıfını oluşturun
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using System.Data.SQLite; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SQLiteWithEF { public class Product { public int ID { get; set; } public string Name { get; set; } public double Price { get; set; } public int Category { get; set; } } }
Şimdi SQLite veritabanımızı DatabaseContext.cs sınıfı ile Entity Framework’e tanıtalım
using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using System.Data.SQLite; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SQLiteWithEF { class DatabaseContext : DbContext { public DatabaseContext() : base(new SQLiteConnection() { ConnectionString = new SQLiteConnectionStringBuilder() { DataSource = "SQLiteWithEF.db", ForeignKeys = true }.ConnectionString }, true) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); base.OnModelCreating(modelBuilder); } public DbSet Products { get; set; } } }
ConnectionString parametresine veritabanı dosyanızın adresini vermeyi unutmayın. Buraya kadar herşey yolunda gitmiş ise aşağıdaki gibi bir örnek ile uygulamanızı test edebilirsiniz.
DatabaseContext context = new DatabaseContext(); Product newproduct = new Product() { Name = "Samsung Galaxy J7", Price = 1200, Category = 4345 }; context.Products.Add(newproduct); context.SaveChanges(); var data = context.EmployeeMaster.ToList(); foreach (var item in data) { Console.Write(string.Format("ID : {0} Name : {1} Price : {2} Category: {3}{4}", item.ID, item.Name, item.Price, item.Category, Environment.NewLine)); }
Bu şekilde SQLite ile Entity Framework’u kullanmış olduk umarım faydalı olmuştur.
Kaynak: https://www.codeproject.com/Articles/1158937/SQLite-with-Csharp-Net-and-Entity-Framework
Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı