Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Entity Framework – Code First’te IValidatableObject İle Kolonlara Validasyon Ayarlama

Merhaba,

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. Eğer bu işlemler hakkında bir fikriniz yoksa öncelikle Entity Framework İle Code First Yaklaşımı başlıklı makalemi okuyunuz.

    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.

Entity Framework - Code First'te IValidatableObject İle Kolonlara Validasyon Ayarlama

Entity Framework – Code First’te IValidatableObject İle Kolonlara Validasyon Ayarlama

Hele birde şu komutları try catch bloklarına aldığımızda bakalım…

Entity Framework - Code First'te IValidatableObject İle Kolonlara Validasyon Ayarlama

Entity Framework – Code First’te IValidatableObject İle Kolonlara Validasyon Ayarlama

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.

Entity Framework - Code First'te IValidatableObject İle Kolonlara Validasyon Ayarlama

Entity Framework – Code First’te IValidatableObject İle Kolonlara Validasyon Ayarlama


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.

Faydalanmanız dileklerimle…
Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir