Azure DB ile Mvc’de Code First İşlemleri. BÖLÜM -1
Selamlar arkdaşlar. Bugün code first üzerine biraz konuşacağız. Amacı isiminden de anlaşılacağı gibi önce kod yazılıp sonra ilgili DB’yi oluşturmaktır.Ama herzaman bu şekilde kullanılmayabilir.Yapılan unit testlerle, belirlenen senaryoya göre gerekli ihtiyaçların çıkarılması ve bu ihtiyaçlara yönelik ilgili modellerin oluşturulması bir projenin başlangıç adımları olabilir. Bu modeller bize gerçek resmi gösteren en büyük materyallerdir. Bu objectler POCO(Plain Old CLR Object) şeklinde isimlendirilirler. Bunlar bizim database’deki tablolarımıza karşılık gelen objectlerdir.Ve entitiy framwork, gerçekte veritabanımızda bu tablolar yok ise, çalışma zamanında biz herhangi bir müdahalede bulunmamış isek oluşturulurlar. Bir de Context diye tabir edilen sınıflarımız vardır.Bunlar da model içerisindeki POCO tiplerine ait koleksiyolara erişimi sağlarlar. Code First’ün 2 farklı türü vardır.
- On Existing Database(Yani var olan bir database üstünde çalışma)
- New Database(Olmayan bir database üstünde çalışma.)
Biz bugün iş dünyasında daha fazla kullanılan var olan bir database üstünde konuşacağız. Öncelikle Azure üzerinde ScienceScholl adında Sql DB’mizi oluşturalım. Alttaki ekran görüntüsü buna aittir.
Şimdi connection string’i alalım ve sql server management studio’muzda azure’daki database’imize local DB’miş gibi erişelim.
Bu da bize azure ile çalışmanın nekadar kolay olduğunu gösteren güçlü bir örnektir. Önemli bir konu da azure üzerinde oluşturduğumuz ScienceScholl database’ine local makinamızdan erişe bilmek için o an geçerli olan local IP’mize azure üzerinden izin vermeliyiz. Aşağıda azure üzerinde yarattığımız database’in connection bilgilerine ve IP adreslerinin yönetim ekranına nereden erişebileceğimizi görmekteyiz.
Evet herşey yolunda ise yaratmış olduğumuz ScienceScholl database’inde tablolarımızı oluşturmaya başlıyalım. Tabi kendi local makinamızdan, Azure üzerine.
Ayrıca Azure üzerinden tablolarımıza alttaki linkten erişebiliriz.
Örnek Ekran görüntüsü:
Tablolarımız arasındaki dependencies’ye ilk seviyeden yine azure üzerinden bakabiliriz.
Solutionımızda DAL diye yeni bir Class Library yaratıyoruz. Tüm DB işlerini bu library üzerinden yapıcaz. POCO’larımızı istersek kendi elimizle ekleyebiliriz. İstersek Tool yardımı ile var olan databaseimizden oluşturabiliriz. Ben bu örnekte tool ile oluşturdum. Visual Studio’da Add New Item / ADO.NET Entity Data Model / Codefirst From Database’den ilgili menüye ulaşılabilir.
Azure üzerindeki ScienceScholl databasemize gerekli connection işlemleri yapılarak bağlanılır.Ve POCO’ları oluşturulacak tablolar seçilir. Aşağıda ekran görüntüsünü görmektesiniz.
Şimdi biraz da codelar üzerinde konuşalım. SchollClass POCO’su aşağıda görüldüğü üzere oluşturuldu. ClassName MaxLength’i 50 olarak attribute olarak [StringLength(50)] tanımlandı. Bu tarz [] ile yapılan tanımlanma şekline Data Annotations denmektedir. ClassStudent ile olan relation Virtual ICollection dizi şeklinde bir property ile belirtilmiştir. Gene DB’deki tablo karşılığı attribute ile [Table(SchollClass)] olarak belirtilmiştir. Bir de fluent denen configuration filelar vardır. Başka bir makalede derinlemesine fluentleri inceleyeceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
namespace DAL { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.Spatial; [Table("SchollClass")] public partial class SchollClass { public SchollClass() { ClassStudent = new HashSet<ClassStudent>(); } public int ID { get; set; } [StringLength(50)] public string ClassName { get; set; } public bool? IsActive { get; set; } public virtual ICollection<ClassStudent> ClassStudent { get; set; } } } |
Aşağıda görüldüğü üzere ClassStudent’da [Key] parametresi primary index olan StudentID’yi tanımlamaktadir. SchollClass ile olan relation virtual SchollClass propertysi ile, StudentLesson ile olan relation da StudentLesson property’si ile belirtilmiştir.StudentLesson’da da relationlar aynı şekilde tanımlanmıştır. [NotMapped] olarak tanımlanan propertylerin DB karşılıkları yoktur.Sadece projemiz içinde kendi özel amaçları için kullanılmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
namespace DAL { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.Spatial; [Table("ClassStudent")] public partial class ClassStudent { public ClassStudent() { StudentLesson = new HashSet<StudentLesson>(); } [Key] public int StudentID { get; set; } [StringLength(50)] public string Name { get; set; } [StringLength(50)] public string SurName { get; set; } public int? StudentNo { get; set; } public int? SchollClassID { get; set; } public virtual SchollClass SchollClass { get; set; } public virtual ICollection<StudentLesson> StudentLesson { get; set; } [NotMapped] public string ClassName { get; set; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
namespace DAL { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.Spatial; [Table("StudentLesson")] public partial class StudentLesson { [Key] public int LessonID { get; set; } [StringLength(50)] public string LessonName { get; set; } public int? FinalScore { get; set; } public int? ClassStudentID { get; set; } public virtual ClassStudent ClassStudent { get; set; } [NotMapped] public string StudentName { get; set; } } } |
Gelelim esas ScienceSchool DBContext classımıza: Aşağıda görüldüğü üzere DbContext’den inherit olmuştur. ClassStudent,SchollClass ve StudentLesson Classları DbSet ile property olarak atanmıştır.Kısacası tüm pokolarımızın tutulduğu classdır. OnModelCreating‘de ilgili classların colonlarının db’de propertyleri burada set edilmektedir. Constructor’ında : base(“name=ScienceScholl”) yazısı ile connection strings’in App.config’deki adı belirtilmiştir.Constructor’daki SetInitializer(null) ise database’de migration olmamasını ,uygulama çalıştırıldığı zaman ilgili db’nin yaratılma yada güncellemenin yapılmamasını sağlar.
Database.SetInitializer<ScienceSchool>(null);
OnModelCreating’de Tabloların colonlarının propertylerinin DB karşılıkları tanımlanmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
namespace DAL { using System; using System.Data.Entity; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; public partial class ScienceSchool : DbContext { public ScienceSchool() : base("name=ScienceSchool") { Database.SetInitializer<ScienceSchool>(null) } public virtual DbSet<ClassStudent> ClassStudent { get; set; } public virtual DbSet<SchollClass> SchollClass { get; set; } public virtual DbSet<StudentLesson> StudentLesson { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<ClassStudent>() .Property(e => e.Name) .IsUnicode(false); modelBuilder.Entity<ClassStudent>() .Property(e => e.SurName) .IsUnicode(false); modelBuilder.Entity<ClassStudent>() .HasMany(e => e.StudentLesson) .WithOptional(e => e.ClassStudent) .HasForeignKey(e => e.ClassStudentID); modelBuilder.Entity<SchollClass>() .Property(e => e.ClassName) .IsUnicode(false); modelBuilder.Entity<StudentLesson>() .Property(e => e.LessonName) .IsUnicode(false); } } } |
Bir sonraki bölümde oluşturduğumuz DAL projemizi, yeni yapıcağımız bir Mvc projemizde kullanıcaz. Bu yeni projemizde artık database işlemleri ile ilgili ayrı bir emek harcamamıza gerek yoktur. Artık sadece yapacağımız işe konsantre olabiliriz.
Geldik bir makalenin daha sonuna.
Yarın makalenin devamında görüşmek üzere hoşçakalın.
Not:Örnek Url (İptal): http://codefirstonazure.azurewebsites.net/
Source Code: http://www.borakasmer.com/projects/CodeFirstBlog.rar
Son Yorumlar