Entity Framework Code First Conventions

Bu makalemde Code First Conventions konusunu ele alacağım. Oluşturduğumuz modelin temel şeklini Conventions kullanarak belirleyebiliriz. Convention'lar sınıf tanımlamalarına dayalı kavramsal bir modeli otomatik olarak yapılandırmak için kullandığımız kurallar kümesidir. Convention'lar System.Data.Entity.ModelConfiguration.Conventions namespace'i altında bulunur. Oluşturduğumuz modeli yapılandırmak için Data Annation(bir sonraki makalemde detaylı olarak inceleyeceğim) veya Fluent Api kullanabiliriz.

Code First ile geliştirme yaparken genellikle sınıfları(entity) oluşturarak başlarız.Bu sınıflar domain modelimizi belirler. Sınıfları belirlemenin dışında DbContext'e modelde hangi sınıfları include etmek istediğimizi bildirmeliyiz(Mapping işlemi).Bunu yapmak için DbContext'en yeni bir context türetip bu context'e hangi sınıfları include etmek istiyorsak DbSet property tanımlarız.(DbSet property Veritabanımızdaki tablolara denk gelmektedir.)

public class ConventionsContext:DbContext
    {
        public ConventionsContext()
        {   //Database yoksa yeni database oluştuyoruz
            Database.SetInitializer(new CreateDatabaseIfNotExists<ConventionsContext>());
            
        }
       
        public DbSet<Guest> Guests { get; set; }//Dbset tanımlıyoruz
        public DbSet<Product> Products { get; set; }
    }

Eğer spesifik olarak bir type'ı mapping işleminden hariç tutmak istersek kullanabileceğimiz iki adet yapı vardır. Notmapped attribute yada Fluent API'nin DbModelBuilder.Ignore methoduyla sağlanabilir.

Fluent API 

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Ignore<Guest>();
        }

yada NotMapped attiribute

         
        [NotMapped]
        public string name { get; set; }
   

Primary Key Convention

Code First yaklaşımında bir POCO'nun primary key olduğunun anlaşılması için ya büyük küçük harf ayrımı olmadan ID olarak adlandırılmalı yada class isminin sonuna "ID" eklenmeli.Primary key property'sinin türü nümerik yada GUID(Globally Unique IDentifier) ise otomatik olarak identity(kimlik) olarak tanımlanacaktır.

public class Guest
    {
        //Primary Key
        public int guestId { get; set; }
        public string name { get; set; }


    }

Relationship Convention

Entity Framework'de navigation property iki entity(class,tablo) tipi arasında gezinmek için kullanılır.Her obje navigation property'e sahip olabilir. Katıldığı her ilişki için navigation property o ilişkiyi iki yönlü gezinme ve yönetme imkanı sağlar. Geri dönüş tipi olarak referans nesnesi yada bir koleksiyon döndürür.Code First yaklaşımında navigation property tanımladığımız türleri referans alarak bir ilişki sağlar.Navigation Property tanımladığımızda Code First otomatik olarak Foreign Key oluşturur. 

#region Entities
    public class Guest
    {
        //Primary Key
        public int guestId { get; set; }
        public string name { get; set; }
        //navigationProperty
        public Product Product { get; set; } 

    }
    public class Product
    {
        //Primary Key
        public int productId { get; set; }
        public string name { get; set; }
        //navigationProperty
        public int guests_Id { get; set; }
        public  ICollection<Guest> Guests { get; set; }

    }
    #endregion

Yukarıda ki örneğimde Guest tablosu ve Products tablosu arasında  one-to-many ilişkisi kurar.Ve bir Foreign key oluşturur.Oluşturduğu bu foreign keyi <navigation property adı>_<asıl primary key property name> şeklinde adlandırır.

Not: Int türünde ki Poco'lar null olamaz.

aa

Code first bir Foreign Key'in nullable özelliğine dayanarak ilişkinin çokluğuna karar verir. Eğer Foreign Key nullable ise ilişki de Null olarak kaydedilir.Foreign key not nullable ise ilişki de Not Null olarak kaydedilir. Bir foreign keyi nullable olarak ayarlamak istiyorsak değişkenin türünü Nullable<int> olarak değiştirmeliyiz.

Complex Tür Convention

Kod first primary key olmadan tanımlanan bir sınıfın varlığını keşfederse ve primary key data annation veya Fluent Api ile belirtilmemişşe otomatik olarak Complex tür olarak kaydedilir.Complex tür olarak kaydedilen bir class navigation property barındıramaz.

[ComplexType]
    public class ComplexExample
    {
        public string name { get; set; }
        public DateTime date { get; set; }
    }

Code First Convention konusunun özeti niteliğinde oldu ayrıca data annation ve Fluent API kullanarak Conventions'lar geçersiz kılınabilir.Entity Framework 6.0 itibariyle uygulamaya özel Conventions tanımlayabiliriz.

1 Yorum

  • 22.10.2017 06:24:55
    9ANBuK http://www.FyLitCl7Pf7ojQdDUOLQOuaxTXbj5iNG.com

Yorum Yaz