
Merhabalar Arkadaşlar,
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.
System.ComponentModel.DataAnnotations isim uzayı altında;
Key: PK olarak belirlenecek alan yani EntityKey olan kısımdır.

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 .

Yorum Gönder