Ado.Net Entity, Microsoft’ un Orm aracıdır. Bu araçlar, veritabanı işlemlerini nesneler üzerinden yapmamıza olanak sağlayan yapılardır. Veritabanında bulunan her tabloya karşılık gelen bir nesne bulunmaktadır.
ADO.NET Entity ile veritabanını sınıflar ile oluşturuyoruz
Bu makalemizde basit bir blog veritabanı entity sınıfı oluşturacağız.
Veritabanımızdaki tablolara karşılık olarak class(sınıf)’lar oluşturuyoruz kullanici adından tablomuzun class’ını oluşturalım.
1 2 3 4 5 6 7 8 | public class Kullanici { public int Id { get; set; } public string Ad { get; set; } public string Posta { get; set; } public string Site { get; set; } public DateTime DogumTarihi { get; set; } } |
- Kullanici adı veritabanındaki tablomuzun adını temsil eder.
- Id, Ad, Posta, Site… Kullanici tablosundaki alanlarımızı temsil eder.
- int, string, datetime… Alan türlerini ifade etmektedir.
- Id, Ad, Posta, Site… Kullanici tablosundaki alanlarımızı temsil eder.
- Veritabanı otomatik olarak oluşturulacağında Id alanı otomatik olarak birincil anahtar ve otomatik artarn sayi şeklinde olacaktır farklı bir alanı birincil anahtar yapmak için [Key] Attribute’ünü kullanmalısınız.
DbContext
1 2 3 4 | public class BlogDB : DbContext { public DbSet<Kullanici> Kullanici { get; set; } } |
- Oluşturduğumuz modelin anlam kazanması için bir bağlam (context) oluşturmamız gerekiyor. Bu context bizim modelimizi kullanıp veritabanı işlemlerimizi yapmamıza olanak sağlıyor.
- BlogDB hem DbContext’imizin adı hemde web.config dosyasında tanımlı olan bağlantı cümlemizin(connection string) adı olmaktadır.
- DbSet
kullanacağımız model sınıfımızı belirtiyoruz. - Kullanici buda veritabanı işlemleri için kullanacağımız methodları içinde barındıran sınıfımızın adını ifade ediyor. Aynı zamanda veritabanı otomatik oluşturulduğunda tablo adınıda ifade ediyor.
1 2 3 | <connectionStrings> <add name="BlogDB" connectionString="Data Source=<KAYNAK>;Initial Catalog=<VERİTABANI>;uid=<KULLANICI ADI>;pwd=<ŞİFRE>" providerName="System.Data.SqlClient"/> </connectionStrings> |
web.config dosyasında DbContext’imizle aynı adda olması gereken connection string’imizi tanımlıyoruz ben Sql Server kullandığım için Sql Server için olan connection string’i yer almaktadır alttaki kodda ama farklı veritabanı kullanıyorsanız o veritabanına özel connection string’e www.connectionstrings.com sayfasından ulaşabilirsiniz.
Ekle, Listele, Düzenle ve Sİl (CRUD)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public void Crud() { var db = new BlogDB(); //yeni kullanıcı ekliyoruz var kullanici = new Kullanici { Ad = "Murat ÖNER", Posta = "muhackgames@gmail.com", DogumTarihi = DateTime.Now, Site = "http://www.muratoner.net" }; db.Kullanici.Add(kullanici); db.SaveChanges(); //kullanıcıların listesini alıyoruz var kullanicilar = db.Kullanici.ToList(); //kullanici bilgisini güncelliyoruz var kullaniciGuncelle = db.Kullanici.FirstOrDefault(u => u.Id == 1); kullaniciGuncelle.Ad = "Hakan GÜNER"; db.SaveChanges(); //kullanıcı siliyoruz var kullaniciSil = db.Kullanici.FirstOrDefault(u => u.Id == 1); db.Kullanici.Remove(kullaniciSil); db.SaveChanges(); } |
Üstteki kodlarda görüldüğü üzere hiç sql cümlesi olmadan Linq kodlarıyla kayıt ekledik, listesini aldık, güncelledik ve sildik bu işlemlerin hepsini class’larla yaptık ama arkaplanda Sql Profiler’dan görebileceğiniz gibi sql kodu üretip işlem yapmaktadır.
Doğrulama (Validation)
Veriler eklenirken yada düzenlenirken bazı kurallar çerçevisinde bu işlemler gerçekleştirilir. Bazı alanlar boş olamaz, sadece sayı olabilir yada girilen değer 5 haneli olabilir gibi.. işlemlere doğrulama (validation) diyoruz. Doğrulama işlemlerini modelimizin içindeki ilgili alanlara açıklamalar (Annotations) ekleyerek gerçekleştirebiliyoruz. Temel annotations lar System.ComponentModel.DataAnnotations sınıfı içerisinde bulunuyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [Table("KULLANICI")] public class Kullanici { [Key] public int Id { get; set; } [Required] public string Ad { get; set; } [Required] public string Posta { get; set; } [MinLength(6,ErrorMessage = "En az 6 karakterden oluşmalıdır.")] public string Password { get; set; } public string Site { get; set; } public DateTime DogumTarihi { get; set; } } |
Üstteki DataAnnotionsları kullanabilmek için alttaki namaspace’leri eklemelisiniz
1 2 | using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; |
- [Table(‘KULLANICI’)] – Veritabanında oluşacak olan tablo adını belirtiyoruz.
- [Key] – Veritabanında oluşacak alanın primarykey ve otomatik artan sayı olmasını sağlamaktadır.
- [Required] – Veritabanında oluşacak alanın not null olarak ayarlanması sağlar yani boş geçilemez.
- [MinLength] – En az 6 karakter değer girilebileceğini belirtiyoruz.
Eposta adresi doğrulama gibi özel bir durum için ise kendi kişisel doğrulamamızı yazıp kullanabiliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 | public class EmailAttribute : RegularExpressionAttribute { public EmailAttribute() : base(@"^([0-9a-zA-Z]([-.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a- zA-Z].)+[a-zA-Z]{2,9})$") {} } public class Kullanici { [Email(ErrorMessage = "Eposta adresini lütfen doğru giriniz")] public string EPosta { get; set; } } |
İlişkiler (Relationship)
Veritabanı tasarımındaki en önemli noktayı hiç şüphesiz tablolar arasında ki ilişkiler oluşturuyor. Veri bütünlüğü için hayati önem taşıyan bu noktada modellerimiz içine basit bir şekilde ilişkilerimizi tanımlayabiliyoruz.
1 den Çoğa (1 to n) İlişki
Senaryomuz şu şekilde; bir kullanıcının birden fazla yazısı olabilir. Bu ilişkiyi gerçekleştirmek için yazi adında yeni bir model oluşturup kullanici modeliyle ilişkilendiriyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Kullanici { public int Id { get; set; } public string Ad { get; set; } public string Posta { get; set; } public string Password { get; set; } public string Site { get; set; } public DateTime DogumTarihi { get; set; } public virtual ICollection<yazi> yazilar { get; set; } } public class yazi { public int id { get; set; } public string baslik { get; set; } public string icerik { get; set; } public virtual Kullanici kullanici { get; set; } public int kullaniciId { get; set; } } |
Yukarıda ki modellerimize baktığımızda yazi içerisinde kullanici ve kullaniciId yi belirtip, bir yazının bir kullanıcıya ait olduğunu belirtiyoruz. Kullanici tarafında ise ICollection
Çoktan Çoğa (n to n) İlişki
Bu seferki senaryomuz, birden çok yazının birden çok kategoriye ait olması. Bu durumu gerçekleştirmek için yukarıdaki modellerimizin yanına birde kategori adında bir model ekliyor ve gerekli değişiklikleri yapıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class kategori { public int id { get; set; } public string adi { get; set; } public virtual ICollection<yazi> yazilar { get; set; } public int yaziId { get; set; } } public class yazi { public int id { get; set; } public string baslik { get; set; } public string icerik { get; set; } public virtual Kullanici kullanici { get; set; } public int kullaniciId { get; set; } public ICollection<kategori> kategoriler { get; set; } public int kategoriId { get; set; } } |
Kategori modelinin içine, birden fazla yazı olabileceği için bir tanımlama yapıyoruz, aynı tanımın tersini yazı modeli içinde yapıyoruz. Bu durum sonucunda oluşan tablo yapısı aşağıdaki gibi oluyor.
SqlQuery, ExecuteSqlCommand
1 2 | var result8 = context.Database.SqlQuery<kullanici>("Select * from kullanici"); context.Database.ExecuteSqlCommand("update from kullanici set adi = 'test' "); |
result8 de kendi sql sorgumuzu direk yazıp kullanabiliyoruz, burada dikkat edilecek husus veritabanından dönen alanların türleri ve isimleri yüklenecek sınıftakilerle birebir aynı olmalıdır. Bu yöntemi veritabanında ki bir view dan kayıtları çekmek için kullanabiliriz.
Direk sql komutu çalıştırmak için ExeCuteSqlCommand özelliğini kullanabiliyoruz. Bu özellik bazı durumlarda hayati önem taşıyabiliyor.
Veritabanında Değişiklik Yapma
Veritabanınıza daha sonrada alan eklediğinizde, değiştirmek istediğinizde değişikliği class’larda yapınız eğer classlarda değişiklik veya ekleme yaptıysanız Visual Studio'dan Tools > Nuget Package Manager > Package Manager Console dedikten sonra açılan consol penceresinde PM>
yazısını gördüğünüzde kod yazmaya başlayabiliriz anlamına gelmektedir. Değişiklikleri kaydetmek için Add-Migration
yazın enter’a basın daha sonra değişikliği kayıt altına alacağı için herhangi bir isim girip enter’a basın(Eğer kırmızı renkli içerisinde Enable-Migrations
gibi bir ifade çıkarsa öncelikle migrations’ları aktif etmelisiniz aktif etmek için konsol ekranına Enable-Migrations
yazıp entera basın ardından tekrar Add-Migration
yazın entera basın) ardından Update-Database
yazarak değişikliklerin veritabanınada uygulanmasını sağlayabilirsiniz.