Code First Yaklaşımı -DataAnnotation Attribute Degerleri



Merhabalar Arkadaşlar,

Code First yaklaşımında, veritabanı tarafının üretilmesi aşamasında devreye girmekte olan bir takım kurallar bütünü bulunmaktadır.Convention olarak adlandırılan bu kurallar bütünü aslında System.Data.Entity.ModelConfiguration.Conventions isim alanı altında yer alan bazı tipler yardımıyla ifade edilmektedir.Code First de veritabanı modelinin olusturulması için default olarak class ve propertylerime bir takım nitelikler verir.(Orneğin ID alanının PK Kabul edilmesi gibi..)
Ben Code First ün database olustururken kullandığı yapıyı kullanmak istemiyorsam ne yapmalıyım Örnegin ID alanımı değil No olan bir alanı PKey belirlemekgibi ,code first de string ifadeler nvarchar(MAX) olarak alınıyor ama ben nvarchar(50) tanımlamak istiyorum gibi.Bunun için database modelini olusturan metodu ezmemiz gerekiyor.

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
//Fluent Api ifadeleri
}

Bundan sonra artık tablolar arasındaki ilişkileri(PK ,FK alanlarını verilmesi,null olup olma durumunun kontrolu,veritip kontrolu vb) özelikleri belirlemek için ya API Fluent yonetimini kullanırız yada Data Annotation namespaceleri eklenerek bu namespacedeki tipleri düzenleyerek kullanırız Tablolar arasında ilişkileri Foreign Key ve Navigation özelliklerini kullanarak belirliyoruz.Bu ilişkileri vermek için Fluent API içinde HasRequired, HasOptinal ve HasMany gibi bazı metotları kullanıyoruz. Bu metotlar lambda ifadelerini parametre olarak alırlar.Kısaca bu metodlar ne işe yarıyor bir bakalım…
HasKey metodu: Tablonun Primary Key alanını ifade etmek için kullanılır.
HasRequired metodu: Tablo alanlarının boş bırakılamayacağını belirtir.NULL geçilemez demektir
HasMany metodu: Bir kolleksiyona yönlenen lambda ifadesi içerir.
HasForeignKey metodu: Bir tabloya başka bir tablonun PK alanını vermek için yani Foreign Keyi vermek için kullanılır.

Aşağıda örnek bir kullanım vardır.

Benim uzerinde duracağım nokta daha çok DataAnnotation kısmı olacak.Code First ün class ve propertyler için defaultta belirli bir dizi nitelikler atadıgını soylemiştim şimdi bu nitelikleri değiştirmek için kullanacağımız bir diğer yapı olan DataAnnotation kısmını inceleyelim Bu yontem Code First e benim class ve propertylerimin ne olacağına ben karar veririm diyor yeri gelmişken söyleyelim kontrol gücü ve daha fazla özelliği barındırması bakımından bu 2 yöntemi kıyaslarsak API Fluent yontemi daha güçlüdür. Öncelikle DataAnnotation isim uzayına ait propertylere erişmek için namespaceler eklenmelidir


Propertylerin kullanımına ornek verecek olursak;
Yukarıdaki sınıfımızda Primary key olarak olarak ProfesorNo belirlendi,yine aynı şekilde ProfAdi propertysine string karakter uzunlugu olarak 5-50 arasında girmesi gerektiğini soyleyen ,girmemesi durumunda hata mesajı veren,Adres alanının boş bırakılamayacağını yani NULL geçilemeyeceğini belirten DataAnnotation tipleri kullanıldı.

Görüldüğü gibi bu yöntemde propertylere özellik atamak çok hızlı şekilde yapılabiliyor.

Şimdi kullanabileceğimiz diğer System.ComponentModel.DataAnnotations ve System.ComponentModel.DataAnnotations.Schema attributeleri nelerdir bunları inceleyelim
System.ComponentModel.DataAnnotations isim uzayı altında;

Key: PK olarak belirlenecek alan yani EntityKey olan kısımdır.

Örneğin Class içindeki iki özelliği beraber Primary key olarak işaretlemek istersek
Timestamp: Sadece byte[] tipindeki özelliklere uygulanabilir.
Required:Boş bırakılamaz alanlara(propertylere) uygulanır.Yukarıda ornegi bulunuyor MinLength:Veritiplerinin en az ne kadar very uzunluguna sahip olacagı bildiriliyor.String yada array ifadelerin uzunlugu bellirtilir
MaxLength: Veritiplerinin en fazla ne kadar veri uzunluguna sahip olacagı bildiriliyor. String yada array ifadelerin uzunlugu belirtilir

Bu örnekte StudentName alanı en az 2 en fazla 50 karakter uzunluguna sahip olacaktır StringLength: Sınıflarda string tipteki propertylere uygulanabilir. Yukarıda örnegi bulunuyorSystem.ComponentModel.DataAnnotations.Schema altındakiler ise;

Table: Tablo adı sınıf adı ile eşleştirilir.

Column: Sınıf propertysi ile Sutun adı ve veri tipleri eşleştirilir

Foreign Key: Navigasyon özelliği için yabancı anahtar özelliği belirtilir.

NotMapped :Class içindeki bir property değerini database de olusturmak isteniyorsak bu özellik kullanılmalıdır.

Ayrıca bunların dışında ComplexType da tanımlanabilir.

Not:FLUENT API yi kullanmak Annotations'dan hem daha okunaklı hem de tüm yetenekleri barındırması açısından tercih sebebidir .

Peki ben hangi yöntemi kullanacağım diyenler için Microsoft, FLUENT API yöntemini önermektedir ama tercih sizin tabiki de :)

Yorum Gönder