Bu yazımızda Entity Framework mimarisinin Code First yaklaşımında, IValidatableObject Interface’i ile kolonlara validasyon uygulamayı detaylı bir şekilde irdeleyeceğiz.
- Gençay Yıldız
- 07 Mayıs 2019
- 1242 kez görüntülendi.
Bu yazımızda Entity Framework mimarisinin Code First yaklaşımında, IValidatableObject Interface’i ile kolonlara validasyon uygulamayı detaylı bir şekilde irdeleyeceğiz.
Örnek amaçlı aşağıdaki öğrenci tablosunu temsil eden sınıfımızı baz alacağız.
class Ogrenci { public int OgrenciID { get; set; } public string Adi { get; set; } public string SoyAdi { get; set; } public string Memleketi { get; set; } }
Validasyon uygulayacağımız sınıfa öncelikle “System.ComponentModel.DataAnnotations” kütüphanesini using etmeliyiz. Ardından ilgili kütüphane içerisindeki “IValidatableObject” Interface’inden sınıfımızı türetmeliyiz.
class Ogrenci : System.ComponentModel.DataAnnotations.IValidatableObject { public int OgrenciID { get; set; } public string Adi { get; set; } public string SoyAdi { get; set; } public string Memleketi { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { } }
Gördüğünüz gibi “IValidatableObject” Interface’ini implement ettikten sonra “Validate” isimli metodu uygulamaktadır. İşte bu metod içerisinde validasyonlarımızı gerçekleştireceğiz.
class Ogrenci : System.ComponentModel.DataAnnotations.IValidatableObject { public int OgrenciID { get; set; } public string Adi { get; set; } public string SoyAdi { get; set; } public string Memleketi { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Adi.Length < 5 || Adi.Length > 35) { yield return new ValidationResult("Adınız 5'ten büyük, 35'ten küçük olmalıdır.", new List<string> { "Adi" }); } } }
Örnek olarak yukarıdaki işlemi incelerseniz eğer “Adi” kolonuna bir kontrol uygulanmıştır. Bu kontrol neticesinde geriye mesaj niteliğinde bir değer dönebiliyoruz.
Proje ile veritabanı arasında bağlantıyı oluşturacak Context sınıfını ve gerekli işlemleri yaptığımızı varsayıyorum
class Program { static void Main(string[] args) { OkulDBContext Veri = new OkulDBContext(); if (!Veri.Database.Exists()) { Veri.Database.Create(); } Ogrenci ogrenci = new Ogrenci(); ogrenci.Adi = "Can"; Veri.Ogrenciler.Add(ogrenci); Veri.SaveChanges(); Console.Read(); } }
Yukarıdaki kod bloğunu incelerseniz eğer “Adi” kolonundaki validasyona uymayacak şekilde bir veri girilmiştir. Haliyle SaveChanges() metodu çağrıldığı anda aşağıdaki olası durumla karşılaşıyoruz.
Hele birde şu komutları try catch bloklarına aldığımızda bakalım
Gördüğünüz gibi “EntityValidationErrors” üzerinden validasyonun mesajına erişebiliyoruz.
class Program { static void Main(string[] args) { OkulDBContext Veri = new OkulDBContext(); if (!Veri.Database.Exists()) { Veri.Database.Create(); } Ogrenci ogrenci = new Ogrenci(); ogrenci.Adi = "Can"; Ogrenci ogrenci2 = new Ogrenci(); ogrenci2.Adi = "Ali"; Ogrenci ogrenci3 = new Ogrenci(); ogrenci3.Adi = "Cem"; Ogrenci ogrenci4 = new Ogrenci(); ogrenci4.Adi = "abdurrahman uzunkavakaltındayataruyuroğulları"; Veri.Ogrenciler.Add(ogrenci); Veri.Ogrenciler.Add(ogrenci2); Veri.Ogrenciler.Add(ogrenci3); Veri.Ogrenciler.Add(ogrenci4); try { Veri.SaveChanges(); } catch (Exception ex) { } Console.Read(); } }
Yukarıdaki durumu incelersek eğer sonuç aşağıdaki gibi olacaktır.
Yani demek istediğim o ki, kaç nesnede validasyona takınıldıysa o kadar hata elde edilmekte, bir başka deyişle tüm hatalara ulaşılabilmektedir.
Eğer Validation hatalarını Error almaksızın yakalamak istiyorsanız eğer Context sınıfı üzerinden “GetValidationErrors” metodunu kullanabilirsiniz.
class Program { static void Main(string[] args) { OkulDBContext Veri = new OkulDBContext(); if (!Veri.Database.Exists()) { Veri.Database.Create(); } Ogrenci ogrenci = new Ogrenci(); ogrenci.Adi = "Can"; Veri.Ogrenciler.Add(ogrenci); var Hatalar = Veri.GetValidationErrors(); if (!Hatalar.Any()) { Veri.SaveChanges(); } Console.Read(); } }
Tabi örnektede yaptığım gibi eğer “GetValidationErrors” metodu sonucunda hata verileri geliyorsa “SaveChanges” metodunu devreye sokmamız gerekmektedir.
Gençay Yıldız ın tüm makalelerine bu linkten ulaşabilirsiniz.
Bu yazıya 0 yorum yapılmış.