Entity FramWork nedir ve MSSQL yüzeysel

 

MSSQL Structure Query Language

Sql servarlarda, verilerin modelleri tasarlanır.İlişkisel veri tabloları hazırlar.
Sınıf neyse, Sqldeki tabloda odur. Sınıfın Ad Soyad propertileri, Sqldeki kolon ve sütunlardır.
Design ekranından kolaylıkla tablo oluşturabiliyoruz.Mssql bizim için arka planında T-Sql komutları oluşturur.
Herbir kolona isim verirken, tabi sağ satırına bunların veri türlerini de belirtiriz
Tablomuzdaki kolonlara default değer atayabiliriz. Bunun için İlgli kolonun propertieslerine gelip Default Value sekmesine değer veririz.
Örneğin; Görütntülenme(int) kolonumuzun başlangıç değeri 0 olsun, DateTime kolonumuzun başlangıç değer GetDate() methodu ile bugün olsun,IsDelete(bit) kolonumuzun başlangıç değeri 0 yani false olsun.
Kolondaki değişkenler'e otomatik artsın diye komutta verebiliriz. Bunun için ilgili kolonun propertieslerine gelip Is Identity: Yes yaparız.Artık bu bir kimliktir. Identity Increment: artış miktarını gösterir 1'er 1'er artsın.Identity Seed ise: başlangıç değeridir 1 den başlasın.

Entity Framework

Düşünelim ki birden çok projemiz var, bir projemiz mysql diğeri msql diğeri oracle dan veri çekiyor.Bunlar için ayrı ayrı yazılım yapmamız gerekir.
Eskiden Ado.Net kullanırdık, SqlCommandlar oluşturur,Select komutlarını metin olarak yazar, parametrelerini girer, birde onları yorumlardık. Microsoft, İşimizi kolaylaştırmak adına server ve yazılımcı arasında bir araç (kütüphane) geliştirmiş. Bu kütüphanede isteleme, ekleme gibi birden çok metodlar yazılmış ve yazılımcının tek yapması gereken bunları sorgulamak istemektir. İşte Bu tür araçlara ORM araçları diyoruz.Orient Relational Mapping. ORM araçları sadece Microsofta özgü değildir.Tüm programlama dillerinin ORM aracı var. Bizim kullanacağımız, .Net için geliştirilmiş olan microsoftun kendi oluşturduğu Entity Framework Orm aracıdır. ORM, veritabanı ile yazılım dilleri arasında kütüphane çalıştırarak (metod,properties) T-Sql komutlarını çalıştırmamızı sağlar.ORM aracı ayrıca yazılım ortamına, bir de harita çıkarır. Entity Framework , NHiberante, Devexpress birer ORM dur
Entity Framework ORM aracı ne yapacak? Tablolarımızı classlar'a, Sütunlarımızı ise propertilere çevirecek.Bunun yanı sırada birsürü metodlarından yararlanıcaz.

Entity Framework ekleme

Visual Studio programımızda proje oluşturalım ve nugget kütüphanesinden Entity Framework kütüphanemizi ekleyelim.

Entity klasörü oluşturalım sağ click add-new data diyerek Ado.Net Entity Entity Data Model'i seçelim, isim olarak projemizinadını ve Model sözcüğünü ekleyelim ki bunun bir veritabanı için oluşturulmş bir dosya olduğu belli olsun.Karşımıza kurulum sihirbazı geliyor. Varolan bir veritabanını bir model olarak yaratıcaz yani EF designer from database. Framework ekleyelim.Bağlantı bilgilerimizi girelim ve bize kendisi bağlantı metni oluşturup web confige ekleyeceğini belirtir.İsim olarakta kendisi Entitiler vermişdir(Birden çok entity var), sonraki panelde ilgili tablolarımızı varsa view sorgularımızı seçiyoruz, foregn key kolonlarını eklesin, varsa stored functionsları eklesin, plurize dediği çoğulaşştırmaktır buna gerek yoktur, bunları onaylayıp Tamam dyelim.

Gelen EF dataModelimizi inceleyelim.

edmx bizim diyagram haritamızdır.

Context.cs Beyni yöneten ana class. Oluştuuralan veritabanı ile ilişki sağlar. DbContext'ten kalıtım almış. DbContext EF ile veritabanı bağlantısı yapmayı sağlayan Modelimizin orjinal adıdır.DbContext hiç değişmez.biz kalıtım alıp kendi ismimizi verdik. base("name: cnn") bizi connection ismimizdir, bu isimle webconfig'e ayar vermiştir.
public virtual DbSet<Tbl_1Table> Tbl_1Table { get; set; } = virtual (ilişkisel),DbSet(ef'un veritabanındaki tabloları işaretleyen bir classdır) Tbl_1Table isimli class dır
Tbl_1Table clasını karşılayan (lt;Tbl_1Table>) ilişkisel bir tablo var.bu veritabanındaki bir tablodur adı Tbl_1Table'dır.

.tt clasına bakalım. örneğin; clas Tbl_Ornek = Tbl_Ornek tablomuz var.
İçerisinde public int id = int türünde ID adında satırımız gelmiş
public string Name = nvarchar türünde Name adında satırımız gelmiş
public Nullable<System.DateTime> DateTime = datetime türünde datetime adında null olabilir dediğimiz satır gelmiş.
public virtual Ilan ilan get; set; = (virtual)ilişkisel bilgilerimiz virtual olarak gelmiş.Navigational propertilerimizdir.



Sorular

default value için genel örnekler nelerdir? - Tarih tipindeki veritürünün defaulValue'Sunu GetDate() vererek bugünün tarihini almak, GörüntülenmeSayisi int tipine 0 değer verip 0 dan başlamasını sağlamak, Isdelete boolean türüne, defaultvalue 0 yani false vermek gibi ...

Bazen Idlerin artış miktarı 100 er 100 er artar. buna engelleyecek bir parametre var mıdır? Bunun için ID yi başa getir komutu var ona bakarız. :DBCC CHECKIDENT (my, RESEED, 0)

Projemize entity framework eklerken - add-data-Ado.Net Data Model diyoruz. Ado.Net eski bir teknolojiydi neden hala Ado.Net ismi geçiyor? -Açıkçası hiç düşünmedim :D :D framework entegre ediyoruz.



Kısa Notlar

Bilgisayarımızda SQL Management studio'muz olmasa bile Visual Studio içerisinden veritabanını görüntüleme işlemlerini basit anlamda kullanabilirsiniz.

Azure servisleri hoşunuza gelecektir. Yüz tanıma, blog, bot hizmeti gibi ilginizi çekecek uygulamar var.

Entity Framework için çok yavaş çalışır, performans düşük ve ado.net yeğlenir denildi. Lakinyeni bir sürüm olan Entity core ile artık o sorunlar ortadan tamamen kaldırıldı.

Ağaç yapılı kategorilendirme de CategoryID(Identity) ve bir de UstCategoryID vardır.İlişkilendirme sırasında CategoryID, UstCategoryID'ye ilişkilendiirlir.



İlginizi çekebilir
           ORM Araçları
 
1. Java için ORM frameworkleri:
 
 - Hibernate
 - JPA
 - OpenJPA
 - Toplink
 - EclipseLink
 - Apache Cayenne
 - MyBattis
 
2. .Net için ORM frameworkleri
 
  - Entity Framework
 - Nhibernate
 - .Net Persistence
 - BBADataObjects-
 - DataObjects.NET
 - DotNorm
 - FastObjects.NET
 - Norm
 - OJB.NET
 
 3. PHP için ORM frameworkleri:
 
 - Propel
 - Doctrine
 - PHP-Activerecord
 - PdoMap
 - RedBean
    

Ufak bir örnek


        ArchieveDBEntities db = new ArchieveDBEntities();
        [HttpGet]
        public ActionResult Form1_01()
        {
            var tablo = db.Tbl_1Category;
            return View(tablo);
        }


    @using _3_MVC.Models.EntityFramework
    @model IEnumerable<Tbl_1Category>
 
    @foreach (var item in Model)
    {
      @item.CategoryName.ToString(); 
    }





Key Attribute Kısıtlayıcı DataAnnotations ile Ekleme

Code First yaklaşımı değil, Mvc sıradan işlemler

MVC uygulamasında validasyon işlemlerine Data Annotations denir.

Data Annotations attributes are .NET attributes which can be applied on an entity class or properties to override default conventions in EF 6 and EF Core.

DataAnnotations den referans alır, sınıflara kısıtlayıcı koymaya yarar.

Güzel bir makale şimdi bir view model oluşturalım first code nitelikli
      public class RegisterInsertion
    {
        public int UserID { get; set; }
        //mutlaka bir değer girilmesini garanti eder.
        [Required(ErrorMessage = "Lutfen Kullanici Adi Girin", AllowEmptyStrings = false)]
        public string FullName { get; set; }
        [Required]   
        //[StringLength(15,ErrorMessage="Ad 5 ve 15 karakter uzunluğunda olmalı"),MinLength=5)] ileri EF versiyonunda
        [StringLength(15,ErrorMessage="maksimum 15 karakter")]
        public string UserName { get; set; }
        [Required]
        [MinLength(4)]
        public string Email { get; set; }
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
        [Required]
        [Compare("Password")]
        public string PswdConfirmation { get; set; }
    }

        [HttpGet]
        public ActionResult Form1_01()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Form1_01(RegisterInsertion model)
        {
            //E_User iekle = new E_User { FullName = model.FullName, UserName = model.UserName, Password = model.Password, Email = model.Email, isActive = true, DateTime = DateTime.Now };
            Tbl_User iekle = new Tbl_User { FullName = model.FullName, UserName = model.UserName, Password = model.Password, Email = model.Email, isActive = true, DateTime = DateTime.Now };
            int basaridurumu = 0;
            using (ArchieveDBEntities db = new ArchieveDBEntities())
            {
                db.Tbl_User.Add(iekle);
               basaridurumu= db.SaveChanges();
            }
            if (basaridurumu>0)
            {
                TempData["Mesaj"] = "tebrikler";
            }
            else
            {
                TempData["Mesaj"] = "Maalesef";
            }
            return View();
        }


 @using _3_MVC.Models.ViewModels
 @model RegisterInsertion
 
 @TempData["Mesaj"]
 <form action="/_3Ekleme/Form1_01" method="post">
    <input type="text" name="FullName" value="" placeholder="FullName" /> <br />
    <input type="text" name="UserName" value="" placeholder="UserName" /> <br />
    <input type="text" name="Email" value="" placeholder="Email" /><br />
    <input type="password" name="Password" value="" placeholder="Password" /><br />
    <input type="password" name="PswdConfirmation" value="" placeholder="PswdConfirmation" /><br />
    <button>Kaydol</button>
 </form>

Kısa Notlar

EF ile ekleme yaparken verinin dispose olmasını yok olup ramde yer kaplamaması için using ifadesini kullanırım.

EF eklerken, performansını artırmak için önce kaç işlem eklenicekse,onları bir lokalde yükler sonra saveChanges() ile kaydeder.



Ödevimiz Login

      public class RegisterInsertion
    {
        public int UserID { get; set; }
        //mutlaka bir değer girilmesini garanti eder.
        [Required(ErrorMessage = "Lutfen Kullanici Adi Girin", AllowEmptyStrings = false)]
        public string FullName { get; set; }
        [Required]   
        //[StringLength(15,ErrorMessage="Ad 5 ve 15 karakter uzunluğunda olmalı"),MinLength=5)] ileri EF versiyonunda
        [StringLength(15,ErrorMessage="maksimum 15 karakter")]
        public string UserName { get; set; }
        [Required]
        [MinLength(4)]
        public string Email { get; set; }
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
        [Required]
        [Compare("Password")]
        public string PswdConfirmation { get; set; }
    }

        [HttpGet]
        public ActionResult Form1_02()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Form1_02( RegisterInsertion model)
        {     
             
                using (ArchieveDBEntities dc = new ArchieveDBEntities())
                {
                    var loginDetails = dc.Tbl_User.Where(x => x.UserName == model.UserName  && x.Password.Equals(model.Password)).FirstOrDefault();
                    if (loginDetails != null)
                    {
                        
                        return View("Index");
                    }
                }
          
            return View(model); 
        }


      
@using _3_MVC.Models.EntityFramework
 @model Tbl_User
 
 <form action="/_3Ekleme/Form1_02" method="post">
        <input type="text" name="UserName" value="" placeholder="UserName" /> <br />
        <input type="password" name="Password" value="" placeholder="Password" /><br />
        <button>Giriş yap</button>
 </form>