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.

4 thoughts on “EntityFramework 6 ve Postgresql Kullanımı

  1. Entity framework ile microsoft teknolojileri harici baglantilar biraz sıkıntı. Bence nhibernate daha güzel. Fluent altyapısı ile Xml sıkıntısı da kalktı.

  2. Genel olarak ORM tooları hayatı kolaylaştırıyormuş gibi gözüksede, hunharca memory kullanımları, sınırsız veritabanı erişimi istemleri vb gibi çoğaltılacak bir sürü dezavantajlarıda olduğu için çoğu kurumsal çapta projede kullanımı tercih edilmemektedir. Yıllar önce Oracle-EntityFramework ile testler yapmış ve vazgeçmiş birisi olarak selim rumuzlu arkadaşın yazmış olduğuna katılıyorum. Microsoft teknolojileri kendi bahçesinde kullanılmalı.

    • Evet Orhan hocam kolay ve kullanışlı yapısı sayesinde çekici bir yapısı var ORM araçlarının. Piyasada tercih edilme oranı da epeyce yüksek. Memory kullanımını incelemedim. Şu anda bir şey söyleyemem. Fakat dip not olarak ekleyelim, veri tabanına gönderdiği sorguları görmek isteyenler Sql Profiler tarzı araçlar kullanılabilir.

    • @orhan ORM aracı kullanmasanız bile Object Oriented yapısına uygun olması açısından ona yakın bir aracı kendiniz yazmanız gerekebilir. Bu da ekstra zaman kaybı olur. Eğer ORM araçlarında Lazy loading kullanılır ise sizin gönderdiğiniz bir sorguya karşılık arka tarafta ilişkiye göre 10 sorgu çalışabilir. Bu da performans kaybı gibi görülebilir. Fakat Lazy loading kapalı ise sadece sorgu yapılan tabloya istenen sorgu gider ve herhangi bir sorun yaşanmaz.

Comments are closed.