Yukarıdaki bağlantıdan edindiklerimi aktaracağım ve birazda okuduğum, izlediklerimden serpiştireceğim. Maksat kavrama seviyesini idrak düzeyine eriştirmek.
Julia Lerman'ın kitapları var Code First ve DbContext üzerine. Gördümki FLUENT API yi kullanmak Annotations'dan hem daha okunaklı hem de tüm yetenekleri barındırması açısından tercih sebebi.
Tablolar arasında ilişkileri Foreign Key ve Navigation özelliklerini kullanarak yapıyoruz. Bu ilişkileri vermek için Fluent API içinde HasRequired, HasOptinal ve HasMany metotlarını kullanıyoruz. Bu metotlar lambda ifadelerini parametre olarak alırlar.
HasKey metodu; tablonun Primary Key alanını ifade etmek için kullanılır ve POCO sınıfında bu değer otomatik oluşturuluyorsa girilmez.
HasRequired metodu; tablo alanlarının boş bırakılamayacağını işaretlemekte kullanılır.
HasMany metodu; bir kolleksiyona yönlenen lambda ifadesi içerir.
HasForeignKey metodu; tabloya başka bir tablonun PK alanını vermek için kullanılır.
http://stackoverflow.com/a/7644906/104085
Tersi yönündeki yönelmeyi de WithRequired, WithOptinal, WithMany metotları sağlar.
VT'yi oluşturmak için kullanacağımız Provider ve VT erişimi için kullanıcı bilgilerini .Config dosyasında tutalım ve DbContext'in yaratıcı metoduna parametre olarak verelim:
<connectionStrings> <add name="cnn" connectionString="data source=.; Initial Catalog=cop; Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings>
DbContext'i miras alan ve tüm DbSet'leri tutarak VT'nin yaratılması öncesi eylemleri yapacağımız sınıfta VT'yi her defasında silip tekrar yaratalım:
public class Kontext : DbContext { public Kontext() : base("name=cnn") { this.Database.Delete(); //VT yi silelim this.Database.CreateIfNotExists(); //Silinmiş VTyi yaratalım } }
HasRequired
Veritabanını oluşturmak için aşağıdaki kodlama yapılır ve One To One tablo yapısı oluşturulur. Burada principal Adres olacak ve Kisi sınıfında FK olarak yer alacak.Eğer Adres bilgisi(Kisi->IkametAdresi) girilmeden Kisi nesnesini VT ye giremezsiniz. İşte aşağıdaki hata sonucu:
Böyle bir ilişkide eğer önce Foreign Key nesnesini girilmeli:
Aşağıdaki POCO yapısına göre daha aşağıda oluşan VT'yi göreceksiniz:
public class Kontext : DbContext { public Kontext() : base("name=cnn") { this.Database.Delete(); this.Database.CreateIfNotExists(); } #region DbSets public DbSetKisiler { get; set; } public DbSet Adresler { get; set; } public DbSet Meslekler { get; set; } #endregion protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity ().HasKey(p => p.Id) .HasRequired(p => p.FaturaAdresleri) .WithMany(); } } public class Kisi { public int Id { get; set; } public string Adi { get; set; } public virtual ICollection Mesleks { get; set; } public virtual ICollection FaturaAdresleri { get; set; } public virtual ICollection TeslimatAdresleri { get; set; } } public class Meslek { public int Id { get; set; } public string Adi { get; set; } public virtual ICollection Kisis { get; set; } } public class Adres { public int Id { get; set; } public string AcikAdres { get; set; } }
Saat 00:35. Yarın ola hayrola ...