B3.Extensions.Data Entity Framework Eklentisi

19 May

Entity Framework Core üzerinde yaptığım çalışmalarda gerek duyduğum araçları bir kütüphanede toparlıyorum ve Github üzerinden B3.Extensions.Data adında açık kaynak kütüphane olarak yayınlamaya ve Nuget paketleri halinde sunmaya başladım.

Nuget Yüklemesi

Kütüphaneyi Nuget üzerinden projelerinize aşağıdaki gibi yükleyebilirsiniz:

Install-Package B3.Extensions.Data

DbContextExtensions.cs

Extension Method’lar:

  • ExecuteQuery(string query, params object[] parameters)
  • ExecuteQueryAsync(string query, params object[] parameters)

Entity Framework Core 2.1 sürümünden itibaren düz SQL sorguları yapmak için bir Entity türüne ihtiyacınız vardır. (Bu durum daha sonraki versiyonlarda değişebilir.) Özel bir SQL query string çalıştırmak için DbSet<> tipine ait FromSQL() extension metodu kullanılır.

var blogs = context.Blogs
                   .FromSqlRaw("SELECT * FROM dbo.Blogs")
                   .ToList();

Ancak birden fazla tablonun birleştirilerek üretilen karmaşık sorguların kullanılması gerektiği durumlarda, bu yöntemin işe yaramaz. Bu durumda B3.Extensions.Data kütüphanesi kullanılabilir.

Örneğin asp.net core action metodu içerisinde şu şekilde kullanılabilir.

public async Task<IActionResult> Get()
{
   var sql = "SELECT type, SUM(length) FROM ways GROUP BY type";
   var queryResult = await _context.ExecuteQueryAsync(sql);

   return Ok(response);
}

ModelBuilderExtensions.cs

Extension Method’lar:

  • UseSoftDelete<TSoftDelete>(this ModelBuilder modelBuilder)

Eğer projelerinizde SoftDelete gibi bir yöntem uyguluyorsanız, bu aracı kullanabilirsiniz. Bu araç sayesinde veritabanından soft delete yapılmış kayıtlar filitrelenir ve getirilmez. Bu metodu kullanabilmek için soft delete kullanan Entity tiplerinizi, içerisinde “IsDeleted” adında bir boolean property bulunması gerekmektedir.

public interface ISoftDelete
{
   bool IsDeleted {get; set;}
}

public class Student: ISoftDelete
{
     public bool IsDeleted {get; set;}
}

Entity Framework Core Extensions Kütüphanesi B3.Extensions.Data Yayında

20 Nis

Entity Framework Core 2.0 ve sonrası versiyonlar ile birlikte, veritabanı sorgulamalarda DbContext üzerinden yapılan model harici sql sorgulamaları kaldırılmıştır.

Mevcut durumda, Entity Framework üzerinden raw sql sorgulamalarını yapmak için genellikle bir model sınıfı tanımlanmalıdır. Yapılan sql sorguları, tanımlanan bu modele cast edilerek çalıştırılabilmektedir.

var result = context.Product.FromSql("SELECT * FROM PRODUCTS").ToList();
var result = await context.Product.FromSql("SELECT * FROM PRODUCTS").ToListAsync();

Ancak bu durum, raporlama işlemleri gibi karmaşık sorguların bulunduğu sql sorgularının mevcut entity framework nesnelerinden yapmak istediğimizde önümüze engel çıkarmaktadır. Üç veya dört tabloyu join ederek sorgulmalar yapmak isteyebiliriz. Ya da modelimiz dışında tablolardan raporlar çekmek isteyebiliriz.

Entity Framework Core ile çalışırken, raw sql komutlarının çalıştırılabildiği B3.Extensions.Data kütüphanesi GitHub üzerinden yayına açılmıştır. Örnek kullanımı aşağıdaki şekildedir:

public async Task<IActionResult> Get()
{
   var sql = "SELECT type, SUM(length) FROM ways GROUP BY type";
   var queryResult = await _context.ExecuteQueryAsync(sql);
            
   return Ok(response);
}

Kütüphaneye NuGet üzerinden de ulaşabilirsiniz. Umarım kullanıcıların işlerini kolaylaştırır.

Bir sonraki yazıda görüşebilmek dileğiyle.

Entity Framework ve ORM araçlarının Lazy Loading mantığı

21 Tem

Entity Framework veya NHibernate veya benzeri ORM araçlarının Lazy Loading özelliği ilişkili tablolardan veri çekerken geliştiricilere büyük kolaylık sağlar. Her kolaylığın bir maliyeti vardır ve ilişkili tablolardan veri çekme işlemi sırasında oluşan maliyetin faturası veri tabanlarına yansıtılmaktadır. Bu yazıda veritabanlarından ilişkili veri çekimi sırasında ORM araçlarının nasıl sorgular oluşturduğunu incelemeye çalışacağız.

İlişkili Tablolar
İlişkili Tablolar

Yukarıdaki şema Blog tablosuna bağlı birçok Article olabileceği gibi, Article tablosuna bağlı birçok Tag olabileceğini göstermektedir. (Veritabanı MsSQL Express’dir.)

Bu yapıya göre bir Blog altındaki Article listesini görmek istediğimizde ve her Article için kaç Tag olduğunu listelemek istediğimizde nasıl bir yol izlemeliyiz? Bunu  Entity Framework kullanarak  incelemeye çalışalım.


public class Blog
{
     public int Id { get; set; }
     public string Name { get; set; }
     public virtual ICollection Articles { get; set; }

     public override string ToString()
     {
         return string.Format("{0} ({1})",Name, Articles.Count);
     }
}

public class Article
{
     public int Id { get; set; }
     public int BlogId { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }

     public virtual Blog Blog { get; set; }
     public virtual ICollection Tags { get; set; }

     public override string ToString()
     {
        return string.Format("{0} ({1} Tags)", Title, Tags.Count);
     }
}

public class Tag
{
     public int Id { get; set; }
     public int ArticleId { get; set; }
     public string Name { get; set; }
     public virtual Article Article { get; set; }
}

public class BloggingContext:DbContext
{
     public DbSet Blogs { get; set; }
     public DbSet Articles { get; set; }
     public DbSet Tags { get; set; }
}

Bu kısımda Entity Framework için veritabanı tablolarını temsil eden tipler oluşturulmuştur. App.config veya Web.config dosyaları içerisinde connectionString ayarlamalarını yaptıktan sonra BloggingContext nesnesi ile veritabanında işlemler gerçekleştirilebilmektedir. Bu işlem aşağıdaki gibi yapılmaktadır.

 static void Main(string[] args)
 {
    using (var context = new BloggingContext())
    {
       foreach (var blog in context.Blogs.ToList())
       {
          Console.WriteLine(blog);
          foreach (var article in blog.Articles)
          {
              Console.Write("\t");
              Console.Write(article);
              Console.Write("\n");
          }
       }
    }
 }

Run
Run

Öncelikle Blog’lar listeleniyor ve parantez içinde her Blog türüne bağlı Article sayısı yazdırılıyor. Article satırına da her Article türüne bağlı Tag sayısı yazdırılıyor.

Bu işlem gerçekleşene kadar acaba veritabanında neler olup bitiyor? Bunu anlamak için Express Profiler aracından faydalanabilirsiniz. Express Profiler aracı veritabanına giden tüm sorguları yakalayabilen bir özelliğe sahiptir.

Kodumuzu çalıştırdığımızda Express Profiler penceresinde bir dizi işlemler raporlanacaktır.

Express Profiler
Express Profiler

Entity Framework öncelikle veritabanının var olup olmadığını sorgular. Daha sonra ilgili tabloların olup olmadığını sorgular. Daha sonra MigrationHistory tablolarını sorgular. Derken bizi ilgilendiren kısım olan Blog listesini çeken sorguyu oluşturulur.

Adsız

Bu sorgu sonrasında Blog listesindeki ilk Blog’a bağlı Article listesi seçilir.

Adsız

Article listesi geldikten sonra ilgili Article için Tag listesi çekilir.

Adsız

 

Bu işlem döngü şeklinde devam eder gider.

Şu anda listelediğim örnek tablolarda toplamda 10 veya 15 veri vardır. Bu işlem yüz binlerce kayıt barındıran tablolarda yapılmaya çalışıldığında epeyce maliyetli olabilir. Maliyeti düşürmek adına JOIN ile oluşturulabilecek ham SQL sorguları kullanmak daha ucuz bir yöntem olacaktır.

SELECT B.Name, COUNT(A.Id)
FROM Blogs as B
LEFT JOIN Articles as A
ON A.BlogId=B.Id
GROUP BY B.Name

ORM araçlarına savaş açmak yerine uygun ve yerinde çözümler üretmek hayat kurtarıcı olabilir.

Güncelleme: 25.07.2015, SQL JOIN sorgusu eklendi.

EntityFramework 6 ve Postgresql Kullanımı

6 Şub

PostgreSQL veritabanına .NET tarafından erişebilmek için Npgsql adında bir provider geliştirilmiştir. Bu provider aracılığı ile veri tabanına sorgular atmak mümkündür.

Ancak günümüzde ORM araçlarının yaygınlaşmasıyla birlikte provider kullanarak veri tabanına erişim yerine ORM araçları tercih edilmektedir. Microsoft .NET tarafında kullanılan ORM aracı Entity Framework‘tür.

Entity Framework kullanarak PostgreSQL veritabanına erişmek için Npgsql paketlerini Nuget üzerinden indirmek gerekmektedir. İndirme işlemi için aşağıdaki komutlar bize yardımcı olacaktır.

Install-Package EntityFramework
Install-Package Npgsql.EntityFramework

Şu anda EntityFramework 6 sürümü piyasaya sürülmüş durumdadır. Bunu da bir not olarak belirtmekte fayda var.

EF ve Npgsql
Entity Framework ve Npgsql

App.config veya Web.config dosyalarında gerekli ayarlamaların yapılması gerekmektedir.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
      <section name="entityFramework"
               type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
               requirePermission="false" />
    </configSections>
    <connectionStrings>
       <add name="ChinookContext"
            connectionString="Server=10.0.1.7;Database=deneme;User Id=denuser;Password=denpass;"
            providerName="Npgsql" />
     <providers>
       <provider
        invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
       <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql" />
     </providers>
   </connectionStrings>
   <entityFramework>
     <defaultConnectionFactory
        type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
     <providers>
          <provider
              invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
     </providers>
   </entityFramework>
   <system.data>
     <DbProviderFactories>
        <add name="Npgsql Data Provider"
          invariant="Npgsql"
          support="FF"
          description="Data Provider for PostgreSQL"
          type="Npgsql.NpgsqlFactory, Npgsql" />
        </DbProviderFactories>
    </system.data>
    <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
       <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" />
       <bindingRedirect oldVersion="0.0.0.0-2.0.14.3" newVersion="2.0.14.3" />
       </dependentAssembly>
       </assemblyBinding>
   </runtime>
</configuration>

Geri kalan işlem klasik Code First yaklaşımının uygulanışı şeklindedir. Öncelikle tablolarımızı temsil eden sınıfları oluşturmalıyız. Bu örnekte Book ve Author sınıfları oluşturulmuştur.

  public class Book
  {
      public string Name { get; set; }
      public virtual Author Author { get; set; }
  }

  public class Author
  {
      public string Name { get; set; }
      public virtual ICollection<Book> Books { get; set; }
  }

Daha sonra Entity Framework için gerekli olan DbContext oluşturmak gerekir.

  public class ChinookContext : DbContext
  {
      public DbSet<Book> Books { get; set; }
      public DbSet<Book> Authors { get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
           modelBuilder.Entity<Book>().ToTable("Book", "public");
           modelBuilder.Entity<Author>().ToTable("Author", "public");

          modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
      }
 }

DbContext sınıfında DbModelBuilder nesnesinin Entity özelliğinde tabloların hangi  şemaya ait olduğunu belirtmemiz gerekmektedir. Aksi taktirde provider, varsayılan olarak “dbo” şemasını arayacaktır. Bu durum bize Exception olarak geri dönebilir.

Bir sonraki yazıda görüşmek dileğiyle.

LINQ sorgularında Karşılaşılan NotSuportedException

11 Mar

LINQ sorguları kolleksiyon temelli yapılarda sorgulamalar ve seçimler yapmak için bize imkan sağlar. Döngülerle diziler içerisinde boğuşmadan istediğimiz formatta sonuç almamıza yardımcı olurlar.

Bazen ihtiyaçlarımız doğrultusunda bir tipte oluşturulmuş kolleksiyon içerisinden başka bir tipte seçimler yapmak durumunda kalabiliriz. Bu noktada kurtarıcı olarak yine LINQ sorgularından faydalanabilmekteyiz.

Örneğin bir ürüne ait bilgileri tutan “Product” tipine ait kolleksiyon içerisinden bize lazım olan ürün başlıklarını seçip alacağımız “ProductTitle” tipli kolleksiyon oluşturma gereği duyduğumuz bir senaryo düşünebiliriz. Bu durumda tüm “Product” nesnesini taşımak yerine ürün adlarını barındıran “ProductTitle” adlı tipi tercih etmiş oluyoruz. Bu şekildeki bir seçimi yapmak için şu şekilde bir LINQ sorgusu yazabiliriz.

     var productTitles = db.Products.Select(p => new ProductTitle{
           Id = p.Id,
           Name = p.Name
     });

Ancak bazı durumlarda seçim yaptığımız tip özellikleri, Property ataması ile değil de bir kurucu metod (Constructor) ile tipe enjekte edileceği durumu senaryo edecek olursak nasıl bir durumla karşılaşacağımıza bakalım.

     StoreEntities db = new StoreEntities();

     var productTitles = db.Products.Select(p => new ProductTitle(p));

Yukarıdaki sorguyu, eğer bir Entity Framework modeli üzerinde çalıştıracak olursak karşımıza şu şekilde bir hata mesajı çıkacaktır.

Unhandled Exception: System.NotSupportedException: Only parameterless constructors and initializers are supported in LINQ to Entities.

LINQ provider, ProductTitles tipinini kurucu metodunda nasıl bir kodun çalıştırılacağından habersizdir. Entity Framework ise LINQ sorgularını olduğu gibi T-SQL sorgularına dönüştürmeye çalışır. Fakat sorgu içerisindeki bir tipin(ProductTitle) kurucu metodunda neler olup bittiğini bilmediğinden işlem durdurulur ve hata raporu oluşturulur.

Bu durumun çözüm yolu ise Entity Framework tarafından IQueryable olarak sunulan kolleksiyonu AsEnumerable extension metodu yardımıyla IEnumerable olarak değiştirmektir.

     StoreEntities db = new StoreEntities();

     var productTitles = db.Products
                           .AsEnumerable()
                           .Select(p => new ProductTitle(p));

Burada sorguda AsEnumerable() extension metodu önce veriyi çekiyor. Ardından seçilen kolleksiyon içerisinden seçim işlemi yapılıyor. Bu sayede hata giderilmiş oluyor. Entity Framework sorgularının IQueryable ve IEnumerable karşısındaki davranışları ve T-SQL dönüşümünü incelemek için Burak Selim Şenyurt’un buradaki ipucundan faydalanabilirsiniz.

Bir sonraki yazıda görüşmek dileğiyle.

Kitap – Programming Entity Framework

14 Ağu

ADO.NET mimarisinin en önemli araçlarından biri olan Entity Framework mimarisini ustasının ağzından dinleyebileceğiniz bir kitap.

Entity Framework yapısının temellerindeki yaklaşımları adım adım anlatmaktadır. Bu yaklaşımları aşağıdaki gibi sıralayabiliriz:

  • Code First
  • Database First
  • Model First

Bunun yanında SQL sorgularının ORM aracıyla kullanılması, Stored procedure kullanımı gibi konularada yer verilmektedir.

ORM araçlarının temelinde yatan entity mantığı derinlemesine irdelenmektedir.

Kitabın dili ingilizce olmakla beraber anlaşılır şekildedir.

Umarım zevkle okursunuz.

Repository Pattern Nedir?

7 Nis

Veri merkezli yazılımların iş katmanlarından veriye ulaşım işlemleri sırasında meydana gelen ve gözardı edilen bazı ayrıntılar, yazılımın ilerki aşamalarında önümüze bir çığ misali yığılıp kalmaktadır. Özellikle katmanlı mimaride geliştirilen yazılımlarda iş kuralları ve katmanlar, düzgün  oluşturulmadığı taktirde bir işi N defa yapmak zorunda kalabiliriz. Ancak nesneye yönelik (object oriented) yapıların ilkelerinden biri de, bir kuralı bir kez belirleyip N kez çalıştırmaktır. Örneğin veritabanındaki öğrenciler tablosuna öğrenci eklemeyi yapan bir nesne ve bir metod olmalıdır.

İş katmanında dikkat edilmesi gereken bazı kurallar vardır. Bunlar:

  • Kod tekrarlarından kaçınmak
  • Hata yakalamayı kolaylaştırmak
  • Kod yazımını ve okunuşunu kolaylaştırmak
  • Test edilebilir bir yapı kurgulamak

Repository pattern de bizi bu kurallara uymaya zorlamaktadır. Peki repository pattern nedir?

Veri merkezli uygulamalarda veriye erişimin ve yönetimin tek noktaya indirilmesini sağlayan bir tasarım desenidir. Veri merkezli uygulama olması şart değil elbette. Ama bu yazıdaki uygulama veriye erişim kurallarını belirleyen bir örnek üzerinden yürütülecektir.

Örneğimiz, bir ASP.NET MVC web uygulaması içerisinden alınmış repository uygulanışını göstermektedir. Verileri, tek noktadan taşıma işlemini yapacak olan repository yapısı da Entity Framework altyapısını kullanmaktadır. Repository pattern için kullanılan teknoloji çokta önemli değildir. MVC veya Entity Framewok gibi detaylara bu örnekte gerek yoktur, yeri gelmişken bahsetmeden geçemedim. İstersek kendi veri katmanımızı (data layer) hazırlayarak da yola devam edebiliriz.

ASP.NET MVC mimarisinin tanıtımı konusunda en etkili örnek olan açık kaynak kodlu Nerddinner uygulaması üzerinden işlemlerimizi yürütmeye çalışacağız. Neden hazır bir uygulama üzerinden gittim? Kendim de bir sınıf hazırlayıp burada kullanabilirdim pek tabi. Ancak, Nerddinner uygulamasını merak edip bakmanızı da istedim, çok faydalı olacağından eminim.

Nerddinner nedir? Hikaye olarak, insanların yemek yiyebilecek yerleri internet üzerinden kaydedebilecekleri veya daha önceden, başkaları tarafından kaydedilen yemek yenilebilecek yerleri görebilmelerini sağlamak şeklinde özetlenebilir. Bu kısmı da yeri gelmişken kısaca özetledikten sonra konumuza dönebiliriz.

Projede yemek yerleri, Dinner tablosunda tutulmaktadır. Entity framework tarafında da, veritabaındaki Dinner tablosu Dinner sınıfı tarafından temsil edilmektedir. Bu noktada Dinner tablosuna CRUD(Create, Update, Delete) işlemlerini gerçekleştirebilmek için bir arayüz (interface) tanımlanır. Bu arayüzü uygulayan(implement) eden sınıflar Dinner tablosuna CRUD işlemlerini yapmaya hazır demektir.

Hazırladığımız interface aşağıdaki gibidir.


public interface IDinnerRepository {

       IQueryable<Dinner> FindAllDinners();
       IQueryable<Dinner> FindDinnersByText(string q);

       Dinner GetDinner(int id);

       void Add(Dinner dinner);
       void Delete(Dinner dinner);

       void Save();
}

Bu arayüzü uygulayan bir sınıfı da aşağıdaki gibi gösterebiliriz.

public class DinnerRepository : NerdDinner.Models.IDinnerRepository
{

       NerdDinnerEntities db = new NerdDinnerEntities();

       Public IQueryable<Dinner> FindDinnersByText(string q)
       {
              return db.Dinners.Where(d => d.Title.Contains(q)
                     || d.Description.Contains(q)
                     || d.HostedBy.Contains(q));
       }

       public IQueryable<Dinner> FindAllDinners()
       {
              return db.Dinners;
       }

       public Dinner GetDinner(int id)
       {
             return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
       }

       public void Add(Dinner dinner)
       {
             db.Dinners.AddObject(dinner);
       }

       public void Delete(Dinner dinner)
       {
            foreach (RSVP rsvp in dinner.RSVPs.ToList())
                db.RSVPs.DeleteObject(rsvp);

            db.Dinners.DeleteObject(dinner);
      }

      public void Save()
      {
            db.SaveChanges();
      }

}

Buradaki NerdDinnerEntities tipi Entity Framework tarafına ait, ObjectContext tipinden türemiş ve kullanıcı tarafından oluşturulan nesneleri alıp kaydetme, güncelleme veya silme işlemleri için oluşturulmuş, motor(engine) görevindeki sınıftır.

Save metodu içerisinde de zaten NerdDinnerEntities tipinin SaveChanges metodu çağrılmıştır ki bu metod, yapılan değişiklikleri veritabanına yansıtır.

Artık Dinner tipindeki bir nesnenin veritabaına kaydedilmesi, güncellenmesi veya silinmesi gibi işlemlerden sorumlu olan sınıf DinnerRepository sınıfıdır. Başka hiçbir yerde bu işlemler için kod yazmaya gerek yoktur. Bir süre sonra, sistemde tarihe göre arama işlemi yapılmak istendiğinde, ilgili metod IDinnerRepository arayüzünde belirlenerek, DinnerRepository sınıfına uygulandığında işlem tamamdır. Tek sorumluluk(Single Responsibility)  DinnerRepository sınıfına aittir. Bu sayede yazılım kurallarından “Tek Sorumluluk” ilkesine de uymuş olduk.

Repository pattern sayesinde test edilebilirlik te mümkün hale gelmektedir. Bu daha ayrıntılı bir konu olduğu için ileriki yazılarımızda işlemeye çalışacağız.

Repository patternle karşılaşmadan önce, kendi kendime desenler oluşturup, tek noktadan veri yönetimini sağlamaya çalışıyordum. Ancak bu desen bana daha düzgün geldi ve artık bu deseni iyice benimsedim. Test gücünü de gördükten sonra vazgeçilmezim oldu. Herkese de tavsiye ederim.

Upgrading Entity Framework 4.1 RC

22 Ağu

Entity Framework 4.1 RC yayınlandı ve eski sürümlerin bu sürüme yükseltilmesi faydalı olacaktır. Bu sürümde bazı küçük hatalar(bug) da giderilmiştir.

EF 4.1 RC  Upgrade sırasında izlenecek yöntem

  1. NuGet konsola uninstall-package EFCodeFirst yazarak eski paketi kaldırılır.
  2. NuGet konsola install-package EntityFramework yazarak yeni sürümü yüklenir.
  3. Birkaç satır kod ile CTP 5 sürümünden RC sürümüne geçiş sağlanır.

1. Uninstall Entity Framework 4.1 CTP 5

NuGet Package Manager eklentisi yüklü değilse buradan edinebilirsiniz.

  • İlk olarak  NuGet Package Manager Console açılarak yola çıkılır:
  • Package Manager penceresinde açılır listede(dropdown list) doğru projenin seçili olduğundan emin olunur.
  • Konsola uninstall-package EFCodeFirst yazarak ENTER tuşuna basılır.
  • View –> Other Windows –> Package Manager Console

Alternatif bir yöntem ise form arayüz (UI) ile NuGet paketin kaldırılmasıdır. Alternatif yol şu şekildedir.

  1. Projeye sağ tıklayarak Add Library Package Reference seçimi yapılır.
  2. Sol menüden Installed Packages seçilir
  3. Uninstall butonuna basarak EFCodeFirst paketi kaldırılır.

2.  Entity Framework 4.1 RC sürümünün NuGet ile yüklenmesi

EF 4.1 RC kurulumu yükleme dosyasını indirerekte kurulabilir fakat NuGet çok daha basit.

  • İlk olarak NuGet Package Manager Console açılarak başlanır. Konsolu açmak için şu yol izlenir:
  • Package Manager penceresinde açılır listede(dropdown list) doğru projenin seçili olduğundan emin olunur.
  • install-package EntityFramework komutu girilerek ENTER tuşuna basılır.
  • View –> Other Windows –> Package Manager Console

Alternatif bir yöntem ise form arayüz (UI) ile NuGet paketin yüklenmesidir. Alternatif yol şu şekildedir.

  1. Projeye sağ tıklayarak Add Library Package Reference seçilir.
  2. Sol menüden Online seçeneği tıklanır.
  3. Sağ üstteki arama kutusuna EntityFramework yazılır ve paketin listeye gelmesi beklenir.
  4. Paket seçilerek Install butonuna tıklandığında yükleme başlar.

Karşılaşılabilecek sorunlara dair ipuçları

 

İpucu 1

Önceki sürümde veritabanındaki store prosedürler gibi yapıları çağırmak işin kullanılan  SqlCommand komutu ExecuteSqlCommand olarak değiştirilmiş.

//return base.Database.SqlCommand(“DeleteAccounts”);
return base.Database.ExecuteSqlCommand(“DeleteAccounts”);

 

İpucu 2

ModelBuilder nesnesi DbModelBuilder olarak yeniden adlandırılmıştır.

//protected override void OnModelCreating(ModelBuilder modelBuilder)
protected override void OnModelCreating(DbModelBuilder modelBuilder)

 

İpucu 3

MapLeftKey ve MapRightKey extension metodlarının aşırı yüklenmiş metodlarıyla değiştirilmiştir. Aşağıdaki kodda verilen değişikliği inceleyebilirsiniz.

 

//modelBuilder.Entity<WatchList>().HasMany(w => w.Securities)
// .WithMany()
// .Map(map => map.ToTable("WatchListSecurity")
// .MapRightKey(s => s.Id, "SecurityId")
// .MapLeftKey(wl => wl.Id, "WatchListId"));
modelBuilder.Entity<WatchList>().HasMany(w => w.Securities)
       .WithMany()
       .Map(map => map.ToTable("WatchListSecurity")
       .MapRightKey("SecurityId")
       .MapLeftKey("WatchListId"));

Kaynak: http://blogs.msdn.com/b/adonet/archive/2011/07/25/ef-4-1-update-1-released.aspx