{"id":33037,"date":"2025-10-28T21:02:53","date_gmt":"2025-10-28T18:02:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/"},"modified":"2025-10-28T21:02:53","modified_gmt":"2025-10-28T18:02:53","slug":"sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/","title":{"rendered":"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<p>Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server&#8217;\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dinamik yaz\u0131l\u0131m d\u00fcnyas\u0131nda, bir uygulaman\u0131n tek bir veritaban\u0131 sistemiyle s\u0131n\u0131rl\u0131 kalmas\u0131 nadiren optimal bir \u00e7\u00f6z\u00fcmd\u00fcr. \u00c7oklu veritaban\u0131 deste\u011fi, yani uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 y\u00f6netim sistemleriyle (DBMS) konu\u015fabilme yetene\u011fi, bir\u00e7ok kritik avantaj sunar. Her \u015feyden \u00f6nce, <strong>\u00f6l\u00e7eklenebilirlik<\/strong> ve <strong>performans<\/strong> a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir esneklik sa\u011flar. \u00d6rne\u011fin, bir mikroservis mimarisinde, her servis kendi \u00f6zelle\u015ftirilmi\u015f veritaban\u0131 tipini kullanabilir. Bir servis kullan\u0131c\u0131 bilgilerini depolamak i\u00e7in PostgreSQL tercih ederken, di\u011feri analitik veriler i\u00e7in bir NoSQL \u00e7\u00f6z\u00fcm\u00fc (\u00f6rne\u011fin MongoDB) veya kritik i\u015f verileri i\u00e7in SQL Server kullanabilir. Bu yakla\u015f\u0131m, her servisin kendi veri depolama ihtiyac\u0131na en uygun teknolojiyi se\u00e7mesine olanak tan\u0131r ve b\u00f6ylece genel sistem performans\u0131n\u0131 art\u0131r\u0131r. B\u00f6ylece, uygulaman\u0131z\u0131n y\u00fck\u00fc dengeli bir \u015fekilde da\u011f\u0131t\u0131larak daha iyi bir kullan\u0131c\u0131 deneyimi sunulabilir.<\/p>\n<p>\u0130kinci \u00f6nemli bir fakt\u00f6r, <strong>vendor lock-in&#8217;den ka\u00e7\u0131nmakt\u0131r<\/strong>. Yani, belirli bir veritaban\u0131 sa\u011flay\u0131c\u0131s\u0131na tamamen ba\u011f\u0131ml\u0131 kalmamak. E\u011fer uygulaman\u0131z yaln\u0131zca tek bir veritaban\u0131 tipiyle \u00e7al\u0131\u015fabiliyorsa, ileride daha iyi bir alternatif ortaya \u00e7\u0131kt\u0131\u011f\u0131nda veya mevcut sa\u011flay\u0131c\u0131n\u0131n maliyetleri y\u00fckseldi\u011finde ge\u00e7i\u015f yapmak son derece zorlu ve maliyetli olabilir. \u00c7oklu veritaban\u0131 deste\u011fi, bu riski azaltarak size teknoloji se\u00e7imi konusunda daha fazla \u00f6zg\u00fcrl\u00fck tan\u0131r ve maliyet optimizasyonu sa\u011flar. Ayr\u0131ca, farkl\u0131 m\u00fc\u015fterilerin veya projelerin farkl\u0131 veritaban\u0131 tercihleri olabilir. Bir m\u00fc\u015fteriniz Oracle kullan\u0131rken, di\u011feri SQL Server&#8217;\u0131 zorunlu tutabilir. Uygulaman\u0131z\u0131n bu farkl\u0131 ihtiya\u00e7lara cevap verebilmesi, pazar eri\u015fiminizi ve m\u00fc\u015fteri memnuniyetinizi art\u0131r\u0131r. Bu durum, \u00f6zellikle dan\u0131\u015fmanl\u0131k veya SaaS (Software as a Service) firmalar\u0131 i\u00e7in b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc olarak, <strong>felaket kurtarma ve y\u00fcksek eri\u015filebilirlik (High Availability)<\/strong> senaryolar\u0131nda \u00e7oklu veritaban\u0131 stratejileri hayati rol oynar. Birincil veritaban\u0131 sisteminizde bir sorun ya\u015fand\u0131\u011f\u0131nda, uygulaman\u0131z\u0131n otomatik olarak ikincil bir veritaban\u0131 sistemine (belki farkl\u0131 bir co\u011frafi b\u00f6lgede veya farkl\u0131 bir sa\u011flay\u0131c\u0131da) ge\u00e7i\u015f yapabilmesi, hizmet kesintilerini en aza indirir. Bu, \u00f6zellikle finans, sa\u011fl\u0131k veya e-ticaret gibi kesintisiz hizmetin kritik oldu\u011fu sekt\u00f6rlerde vazge\u00e7ilmezdir. Bu t\u00fcr bir mimari, i\u015f s\u00fcreklili\u011fini sa\u011flamak ad\u0131na stratejik bir yat\u0131r\u0131md\u0131r. Son olarak, <strong>uyumluluk ve mevzuatlar<\/strong> da \u00e7oklu veritaban\u0131 kullan\u0131m\u0131n\u0131 tetikleyebilir. Baz\u0131 sekt\u00f6rler veya \u00fclkeler, verilerin belirli bir co\u011frafyada veya belirli bir tipteki veritaban\u0131nda saklanmas\u0131n\u0131 gerektirebilir (\u00f6rne\u011fin, GDPR uyumlulu\u011fu). Uygulaman\u0131z\u0131n bu gereksinimlere uyum sa\u011flayabilmesi i\u00e7in birden fazla veritaban\u0131 teknolojisini desteklemesi gerekebilir.<\/p>\n<p>\u00d6zetle, \u00e7oklu veritaban\u0131 deste\u011fi, modern, esnek, \u00f6l\u00e7eklenebilir ve gelece\u011fe y\u00f6nelik uygulamalar geli\u015ftirmek isteyen her yaz\u0131l\u0131mc\u0131n\u0131n ve mimar\u0131n g\u00f6z \u00f6n\u00fcnde bulundurmas\u0131 gereken kritik bir mimari karard\u0131r. Bu yakla\u015f\u0131m, sadece mevcut ihtiya\u00e7lar\u0131 kar\u015f\u0131lamakla kalmaz, ayn\u0131 zamanda gelecekteki de\u011fi\u015fikliklere ve bilinmeyen gereksinimlere kar\u015f\u0131 uygulaman\u0131z\u0131 daha diren\u00e7li hale getirir, b\u00f6ylece uzun vadede yat\u0131r\u0131m\u0131n\u0131z\u0131n de\u011ferini korur.<\/p>\n<h2>Temel Kavramlar: \u00c7oklu Veritaban\u0131 Mimarisi Nedir?<\/h2>\n<p>\u00c7oklu veritaban\u0131 mimarisi, bir yaz\u0131l\u0131m uygulamas\u0131n\u0131n ayn\u0131 anda veya duruma g\u00f6re birden fazla farkl\u0131 veritaban\u0131 y\u00f6netim sistemiyle (DBMS) etkile\u015fim kurabilme yetene\u011fini ifade eder. Bu, SQL Server, PostgreSQL, MySQL, Oracle gibi ili\u015fkisel veritabanlar\u0131n\u0131 veya MongoDB, Cassandra gibi NoSQL veritabanlar\u0131n\u0131 i\u00e7erebilir. Bu mimarinin temelinde, veritaban\u0131 eri\u015fim katman\u0131n\u0131n soyutlanmas\u0131 ve genellikle bir Nesne \u0130li\u015fkisel E\u015fleyici (ORM) kullan\u0131lmas\u0131 yatar. Bu soyutlama, geli\u015ftiricinin veritaban\u0131 detaylar\u0131yla do\u011frudan u\u011fra\u015fmas\u0131n\u0131 en aza indirir.<\/p>\n<p><strong>Nesne \u0130li\u015fkisel E\u015fleyici (ORM):<\/strong> En pop\u00fcler ORM&#8217;lerden biri olan Entity Framework Core (EF Core), .NET uygulamalar\u0131nda veritaban\u0131 i\u015flemlerini nesne tabanl\u0131 bir yakla\u015f\u0131mla kolayla\u015ft\u0131r\u0131r. EF Core, geli\u015ftiricilerin SQL sorgular\u0131 yazmak yerine C# nesneleriyle \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. Bu sayede, geli\u015ftirme s\u00fcreci h\u0131zlan\u0131r ve kodun okunabilirli\u011fi artar. EF Core&#8217;un g\u00fcc\u00fc, farkl\u0131 veritaban\u0131 sa\u011flay\u0131c\u0131lar\u0131 (SQL Server, PostgreSQL, MySQL vb.) i\u00e7in adapt\u00f6rler sunmas\u0131d\u0131r. Bu adapt\u00f6rler sayesinde, ayn\u0131 C# kodunu kullanarak farkl\u0131 veritaban\u0131 t\u00fcrlerine ba\u011flanabilir ve i\u015flemlerinizi ger\u00e7ekle\u015ftirebilirsiniz. Bu, kodunuzun veritaban\u0131 tipi konusunda agnostik olmas\u0131n\u0131 sa\u011flar, yani bir veritaban\u0131ndan di\u011ferine ge\u00e7i\u015f yapmak, \u00e7o\u011funlukla sadece yap\u0131land\u0131rma de\u011fi\u015fiklikleriyle m\u00fcmk\u00fcn olur.<\/p>\n<p><strong>Ba\u011flant\u0131 Dizeleri (Connection Strings):<\/strong> Her veritaban\u0131 i\u00e7in bir ba\u011flant\u0131 dizesi gereklidir. Bu dizeler, uygulaman\u0131z\u0131n veritaban\u0131na nas\u0131l ba\u011flanaca\u011f\u0131n\u0131 (sunucu adresi, veritaban\u0131 ad\u0131, kimlik bilgileri, port numaras\u0131 vb.) belirtir. \u00c7oklu veritaban\u0131 kurulumlar\u0131nda, her veritaban\u0131 i\u00e7in ayr\u0131 ve benzersiz ba\u011flant\u0131 dizeleri tan\u0131mlanmal\u0131d\u0131r. Bu dizeler genellikle uygulaman\u0131n yap\u0131land\u0131rma dosyalar\u0131nda (\u00f6rne\u011fin, <code>appsettings.json<\/code>) saklan\u0131r ve \u00e7al\u0131\u015fma zaman\u0131nda okunarak ilgili veritaban\u0131 ba\u011flant\u0131lar\u0131 kurulur. G\u00fcvenlik nedenleriyle, \u00fcretim ortamlar\u0131nda bu dizelerin ortam de\u011fi\u015fkenleri veya g\u00fcvenli anahtar y\u00f6netim sistemleri (\u00f6rne\u011fin Azure Key Vault, HashiCorp Vault) arac\u0131l\u0131\u011f\u0131yla sa\u011flanmas\u0131 \u015fiddetle tavsiye edilir. Bu yakla\u015f\u0131m, hassas verilerin kaynak kodda yer almas\u0131n\u0131 engeller.<\/p>\n<p><strong>Dependency Injection (Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu &#8211; DI):<\/strong> .NET Core&#8217;un merkezi bir \u00f6zelli\u011fi olan DI, uygulaman\u0131n esnekli\u011fini ve test edilebilirli\u011fini art\u0131r\u0131r. \u00c7oklu veritaban\u0131 senaryosunda, farkl\u0131 <code>DbContext<\/code> nesneleri (her veritaban\u0131 i\u00e7in bir tane) DI konteynerine kaydedilir. Uygulaman\u0131n farkl\u0131 katmanlar\u0131, hangi veritaban\u0131na eri\u015fmeleri gerekiyorsa, ilgili <code>DbContext<\/code>&#8216;i ba\u011f\u0131ml\u0131l\u0131k olarak talep eder. Bu, i\u015f mant\u0131\u011f\u0131n\u0131n belirli bir veritaban\u0131 uygulamas\u0131na s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131 kalmamas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n profil bilgilerini y\u00f6neten servis, kullan\u0131c\u0131 veritaban\u0131n\u0131n <code>DbContext<\/code>&#8216;ini enjekte ederken, \u00fcr\u00fcn katalo\u011funu y\u00f6neten servis \u00fcr\u00fcn veritaban\u0131n\u0131n <code>DbContext<\/code>&#8216;ini enjekte edecektir. B\u00f6ylece, her mod\u00fcl kendi verisine odaklanabilir.<\/p>\n<p><strong>Mimari Yakla\u015f\u0131mlar:<\/strong> \u00c7oklu veritaban\u0131 kullan\u0131m\u0131nda farkl\u0131 yakla\u015f\u0131mlar mevcuttur. Bunlar genellikle uygulama karma\u015f\u0131kl\u0131\u011f\u0131na ve ihtiya\u00e7lar\u0131na g\u00f6re se\u00e7ilir:<\/p>\n<ul>\n<li><strong>Tek DbContext, \u00c7oklu Sa\u011flay\u0131c\u0131 (Nadiren):<\/strong> Teorik olarak m\u00fcmk\u00fcn olsa da, tek bir <code>DbContext<\/code>&#8216;in dinamik olarak farkl\u0131 veritaban\u0131 sa\u011flay\u0131c\u0131lar\u0131n\u0131 kullanmas\u0131 karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131r\u0131r ve genellikle tercih edilmez. Genellikle ayn\u0131 <code>DbContext<\/code> tipi, farkl\u0131 ortamlar i\u00e7in farkl\u0131 sa\u011flay\u0131c\u0131larla (SQL Server test ortam\u0131nda, PostgreSQL \u00fcretimde gibi) yap\u0131land\u0131r\u0131l\u0131r. Bu durum daha \u00e7ok ortam ge\u00e7i\u015fleri i\u00e7in uygundur.<\/li>\n<li><strong>\u00c7oklu DbContext, Ayn\u0131 Sa\u011flay\u0131c\u0131:<\/strong> Uygulama i\u00e7inde birden fazla ba\u011f\u0131ms\u0131z veritaban\u0131 (\u00f6rne\u011fin, kullan\u0131c\u0131lar i\u00e7in bir SQL Server VT, sipari\u015fler i\u00e7in ba\u015fka bir SQL Server VT) gerekti\u011finde bu yakla\u015f\u0131m kullan\u0131l\u0131r. Her veritaban\u0131 i\u00e7in ayr\u0131 bir <code>DbContext<\/code> s\u0131n\u0131f\u0131 tan\u0131mlan\u0131r ve bunlar DI konteynerine kaydedilir. Bu, ayn\u0131 teknoloji y\u0131\u011f\u0131n\u0131 i\u00e7inde veri ayr\u0131\u015ft\u0131rmas\u0131 sa\u011flar.<\/li>\n<li><strong>\u00c7oklu DbContext, Farkl\u0131 Sa\u011flay\u0131c\u0131lar:<\/strong> En esnek ve karma\u015f\u0131k senaryo budur. Her veritaban\u0131 tipi (SQL Server, PostgreSQL) i\u00e7in ayr\u0131 bir <code>DbContext<\/code> s\u0131n\u0131f\u0131 tan\u0131mlan\u0131r ve her biri kendi \u00f6zel sa\u011flay\u0131c\u0131 paketiyle yap\u0131land\u0131r\u0131l\u0131r. Bu, bir mikroservis mimarisinde s\u0131k\u00e7a g\u00f6r\u00fcl\u00fcr ve servislerin en uygun veritaban\u0131 \u00e7\u00f6z\u00fcm\u00fcn\u00fc se\u00e7melerine olanak tan\u0131r.<\/li>\n<\/ul>\n<p>Bu temel kavramlar\u0131 anlamak, \u00e7oklu veritaban\u0131 mimarisini ba\u015far\u0131yla uygulaman\u0131n ilk ad\u0131m\u0131d\u0131r. Sonraki b\u00f6l\u00fcmlerde, bu kavramlar\u0131 kullanarak .NET uygulaman\u0131za SQL Server deste\u011fini nas\u0131l entegre edece\u011fimizi ve \u00e7oklu veritaban\u0131 kurulumunu ad\u0131m ad\u0131m nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi g\u00f6rece\u011fiz. Bu sayede, g\u00fc\u00e7l\u00fc ve esnek bir altyap\u0131 in\u015fa edebilirsiniz.<\/p>\n<h2>.NET Uygulaman\u0131za SQL Server Deste\u011fi Nas\u0131l Eklenir? Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Bir .NET Core uygulamas\u0131n\u0131 SQL Server ile konu\u015fturmak, Entity Framework Core sayesinde olduk\u00e7a basittir. Bu b\u00f6l\u00fcmde, mevcut veya yeni bir .NET uygulaman\u0131za SQL Server deste\u011fini nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Bu ad\u0131mlar, uygulaman\u0131z\u0131n tek bir SQL Server veritaban\u0131yla \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flarken, \u00e7oklu veritaban\u0131 kurulumu i\u00e7in de bir temel olu\u015fturacakt\u0131r. Bu s\u00fcreci dikkatli bir \u015fekilde takip ederek hatas\u0131z bir entegrasyon sa\u011flayabilirsiniz.<\/p>\n<h3>1. Gerekli NuGet Paketlerini Y\u00fckleyin<\/h3>\n<p>\u0130lk ad\u0131m, Entity Framework Core&#8217;un SQL Server sa\u011flay\u0131c\u0131s\u0131n\u0131 projenize eklemektir. Bunu NuGet Paket Y\u00f6neticisi Konsolu (PMC) veya .NET CLI arac\u0131l\u0131\u011f\u0131yla yapabilirsiniz. Bu paketler, EF Core&#8217;un SQL Server ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan temel bile\u015fenlerdir.<\/p>\n<pre><code>\ndotnet add package Microsoft.EntityFrameworkCore.SqlServer\ndotnet add package Microsoft.EntityFrameworkCore.Tools\n    <\/pre>\n<p><\/code><\/p>\n<p><code>Microsoft.EntityFrameworkCore.SqlServer<\/code> paketi, uygulaman\u0131z\u0131n SQL Server ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan temel sa\u011flay\u0131c\u0131d\u0131r. <code>Microsoft.EntityFrameworkCore.Tools<\/code> ise migrasyonlar (veritaban\u0131 \u015fema de\u011fi\u015fiklikleri) ve di\u011fer EF Core komutlar\u0131 i\u00e7in gereklidir. Bu ara\u00e7lar, veritaban\u0131 \u015feman\u0131z\u0131 kodunuzla senkronize tutman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>2. Ba\u011flant\u0131 Dizelerinizi Yap\u0131land\u0131r\u0131n (appsettings.json)<\/h3>\n<p>Uygulaman\u0131z\u0131n SQL Server'a nas\u0131l ba\u011flanaca\u011f\u0131n\u0131 bildirmesi gerekir. Bu bilgiyi genellikle <code>appsettings.json<\/code> dosyas\u0131na ekleriz. Tek bir veritaban\u0131 i\u00e7in a\u015fa\u011f\u0131daki gibi bir yap\u0131land\u0131rma yeterli olacakt\u0131r. Ba\u011flant\u0131 dizeleri, uygulaman\u0131z\u0131n kalbi niteli\u011findedir.<\/p>\n<pre><code>\n{\n  \"ConnectionStrings\": {\n    \"DefaultConnection\": \"Server=localhost;Database=MyDatabase;User Id=sa;Password=YourStrongPassword;TrustServerCertificate=True\"\n  },\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>DefaultConnection<\/code> ad\u0131nda bir ba\u011flant\u0131 dizesi tan\u0131mlad\u0131k. <code>Server<\/code>, <code>Database<\/code>, <code>User Id<\/code> ve <code>Password<\/code> de\u011ferlerini kendi SQL Server kurulumunuza g\u00f6re ayarlamal\u0131s\u0131n\u0131z. <code>TrustServerCertificate=True<\/code>, geli\u015ftirme ortam\u0131nda genellikle kullan\u0131lan bir ayard\u0131r ve sertifika do\u011frulamas\u0131n\u0131 atlar. \u00dcretim ortam\u0131nda ger\u00e7ek sertifika do\u011frulamas\u0131n\u0131 kullanman\u0131z \u00f6nerilir, bu daha g\u00fcvenli bir yakla\u015f\u0131md\u0131r.<\/p>\n<h3>3. DbContext S\u0131n\u0131f\u0131n\u0131z\u0131 Olu\u015fturun veya G\u00fcncelleyin<\/h3>\n<p>Entity Framework Core'da, veritaban\u0131 ile etkile\u015fim kurmak i\u00e7in bir <code>DbContext<\/code> s\u0131n\u0131f\u0131 tan\u0131mlaman\u0131z gerekir. Bu s\u0131n\u0131f, uygulaman\u0131zdaki model s\u0131n\u0131flar\u0131n\u0131z\u0131 (entity'lerinizi) temsil eden <code>DbSet<\/code> \u00f6zelliklerini i\u00e7erir. Bu, veritaban\u0131ndaki tablolar\u0131n\u0131z\u0131n C# kar\u015f\u0131l\u0131\u011f\u0131d\u0131r.<\/p>\n<pre><code>\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Models; \/\/ Model s\u0131n\u0131flar\u0131n\u0131z\u0131n bulundu\u011fu namespace\n\nnamespace YourNamespace.Data\n{\n    public class ApplicationDbContext : DbContext\n    {\n        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)\n            : base(options)\n        {\n        }\n\n        \/\/ Model s\u0131n\u0131flar\u0131n\u0131z buraya DbSet olarak eklenecek\n        public DbSet<Product> Products { get; set; }\n        public DbSet<Category> Categories { get; set; }\n        \/\/ ... di\u011fer DbSet'ler\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>ApplicationDbContext<\/code> ad\u0131nda bir s\u0131n\u0131f olu\u015fturduk ve constructor'\u0131nda <code>DbContextOptions<\/code> alacak \u015fekilde yap\u0131land\u0131rd\u0131k. Bu, DI konteynerinden yap\u0131land\u0131rma bilgilerini almas\u0131n\u0131 sa\u011flar. <code>Product<\/code> ve <code>Category<\/code> sizin \u00f6rnek model s\u0131n\u0131flar\u0131n\u0131zd\u0131r. Her <code>DbSet<\/code>, veritaban\u0131ndaki bir tabloyu temsil eder.<\/p>\n<h3>4. DbContext'i Dependency Injection'a Kaydedin<\/h3>\n<p>Uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 s\u0131n\u0131f\u0131 olan <code>Program.cs<\/code> (veya eski versiyonlarda <code>Startup.cs<\/code>) dosyas\u0131nda, <code>DbContext<\/code>'inizi DI konteynerine kaydetmeniz gerekir. Bu, uygulaman\u0131z\u0131n herhangi bir yerinden <code>ApplicationDbContext<\/code> \u00f6rne\u011fine kolayca eri\u015fmenizi sa\u011flar ve uygulaman\u0131n esnekli\u011fini art\u0131r\u0131r.<\/p>\n<pre><code>\n\/\/ Program.cs\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Data;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ Add services to the container.\nbuilder.Services.AddControllersWithViews();\n\n\/\/ SQL Server DbContext'i Dependency Injection'a ekle\nvar connectionString = builder.Configuration.GetConnectionString(\"DefaultConnection\");\nbuilder.Services.AddDbContext<ApplicationDbContext>(options =>\n    options.UseSqlServer(connectionString));\n\nvar app = builder.Build();\n\n\/\/ ... Di\u011fer yap\u0131land\u0131rmalar\n\napp.Run();\n    <\/pre>\n<p><\/code><\/p>\n<p><code>AddDbContext<\/code> metodunu kullanarak <code>ApplicationDbContext<\/code>'i kaydediyoruz ve SQL Server sa\u011flay\u0131c\u0131s\u0131n\u0131 (<code>UseSqlServer<\/code>) kullanarak hangi veritaban\u0131na ba\u011flanaca\u011f\u0131n\u0131 belirtiyoruz. Ba\u011flant\u0131 dizesini <code>builder.Configuration.GetConnectionString(\"DefaultConnection\")<\/code> ile <code>appsettings.json<\/code> dosyas\u0131ndan al\u0131yoruz. Bu, uygulaman\u0131n dinamik olarak do\u011fru ba\u011flant\u0131y\u0131 kurmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>5. Migrasyonlar\u0131 Olu\u015fturun ve Uygulay\u0131n<\/h3>\n<p>Veritaban\u0131 \u015femas\u0131n\u0131 olu\u015fturmak veya g\u00fcncellemek i\u00e7in Entity Framework Core migrasyonlar\u0131n\u0131 kullan\u0131r\u0131z. Projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n. Migrasyonlar, veritaban\u0131 \u015fema de\u011fi\u015fikliklerini izlemenin ve uygulaman\u0131n etkili bir yoludur.<\/p>\n<pre><code>\ndotnet ef migrations add InitialCreate\ndotnet ef database update\n    <\/pre>\n<p><\/code><\/p>\n<p><code>InitialCreate<\/code> yerine migrasyonunuza anlaml\u0131 bir isim verebilirsiniz. \u0130lk komut, model s\u0131n\u0131flar\u0131n\u0131zdan bir migrasyon dosyas\u0131 olu\u015fturur. \u0130kinci komut ise bu migrasyonu SQL Server veritaban\u0131n\u0131za uygulayarak tablolar\u0131 olu\u015fturur veya g\u00fcnceller. Uygulaman\u0131z\u0131n ba\u015flang\u0131c\u0131nda migrasyonlar\u0131 otomatik olarak uygulamak i\u00e7in de kod ekleyebilirsiniz. Bu, \u00f6zellikle geli\u015ftirme ve test ortamlar\u0131nda kullan\u0131\u015fl\u0131d\u0131r, ancak dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<pre><code>\n\/\/ Program.cs i\u00e7inde, app.Run() \u00f6ncesinde\nusing (var scope = app.Services.CreateScope())\n{\n    var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();\n    dbContext.Database.Migrate(); \/\/ Migrasyonlar\u0131 otomatik uygula\n}\napp.Run();\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: \u00dcretim ortam\u0131nda <code>dbContext.Database.Migrate()<\/code> metodunu do\u011frudan kullanmak yerine, veritaban\u0131 g\u00fcncellemelerini ayr\u0131 bir da\u011f\u0131t\u0131m ad\u0131m\u0131 olarak veya kontroll\u00fc bir \u015fekilde yapman\u0131z daha g\u00fcvenli olacakt\u0131r. Otomatik migrasyonlar, beklenmedik veri kayb\u0131na veya kesintilere yol a\u00e7abilir. Veritaban\u0131 y\u00f6netimini otomatize ederken her zaman yedekleme ve kurtarma stratejilerini g\u00f6z \u00f6n\u00fcnde bulundurun.\n    <\/div>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, .NET uygulaman\u0131z SQL Server ile ba\u015far\u0131l\u0131 bir \u015fekilde ileti\u015fim kurabilir hale gelmi\u015f olacakt\u0131r. Art\u0131k <code>ApplicationDbContext<\/code>'i kullanarak veri ekleyebilir, sorgulayabilir, g\u00fcncelleyebilir ve silebilirsiniz. Bu, uygulaman\u0131z\u0131n temel veri operasyonlar\u0131n\u0131 ger\u00e7ekle\u015ftirmesi i\u00e7in gerekli altyap\u0131y\u0131 sa\u011flar.<\/p>\n<h3>Farkl\u0131 Veritabanlar\u0131 \u0130\u00e7in Ayr\u0131 DbContext'ler Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>Bir uygulaman\u0131n i\u015f mant\u0131\u011f\u0131, farkl\u0131 veri setlerini veya farkl\u0131 i\u015f domainlerini ayr\u0131 veritabanlar\u0131nda saklamay\u0131 gerektirebilir. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda kullan\u0131c\u0131 bilgileri bir veritaban\u0131nda, \u00fcr\u00fcn katalo\u011fu ba\u015fka bir veritaban\u0131nda ve sipari\u015f ge\u00e7mi\u015fi \u00fc\u00e7\u00fcnc\u00fc bir veritaban\u0131nda saklanabilir. Bu senaryoda, her veritaban\u0131 i\u00e7in ayr\u0131 <code>DbContext<\/code> s\u0131n\u0131flar\u0131 tan\u0131mlamak en iyi yakla\u015f\u0131md\u0131r. Bu, kodun daha d\u00fczenli olmas\u0131n\u0131, sorumluluklar\u0131n ayr\u0131lmas\u0131n\u0131 ve her veritaban\u0131 i\u00e7in ba\u011f\u0131ms\u0131z migrasyonlar y\u00f6netmenizi sa\u011flar. Bu sayede, her i\u015f alan\u0131 kendi veri depolama gereksinimlerine g\u00f6re optimize edilebilir.<\/p>\n<h4>Vaka Analizi: Bir E-Ticaret Platformu \u0130\u00e7in \u00c7oklu Veritaban\u0131 Y\u00f6netimi<\/h4>\n<p>Hayali bir e-ticaret platformumuz oldu\u011funu varsayal\u0131m. Bu platformun \u00fc\u00e7 ana veri alan\u0131 var:<\/p>\n<ol>\n<li><strong>Kullan\u0131c\u0131lar ve Kimlik Do\u011frulama:<\/strong> Kullan\u0131c\u0131 hesaplar\u0131, profiller ve g\u00fcvenlik bilgileri.<\/li>\n<li><strong>\u00dcr\u00fcn Katalo\u011fu:<\/strong> \u00dcr\u00fcn bilgileri, kategoriler, envanter.<\/li>\n<li><strong>Sipari\u015fler ve \u00d6deme \u0130\u015flemleri:<\/strong> Sipari\u015f ge\u00e7mi\u015fi, \u00f6deme kay\u0131tlar\u0131.<\/li>\n<\/ol>\n<p>Bu verileri \u00fc\u00e7 ayr\u0131 SQL Server veritaban\u0131nda saklamak istiyoruz: <code>AuthDb<\/code>, <code>CatalogDb<\/code> ve <code>OrderDb<\/code>. Her biri i\u00e7in ayr\u0131 <code>DbContext<\/code>'ler tan\u0131mlayaca\u011f\u0131z. Bu ayr\u0131m, her bir alan\u0131n ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenmesine ve y\u00f6netilmesine olanak tan\u0131r.<\/p>\n<h4>1. Ayr\u0131 DbContext S\u0131n\u0131flar\u0131 Olu\u015fturma<\/h4>\n<p>Her veritaban\u0131 domain'i i\u00e7in ayr\u0131 bir <code>DbContext<\/code> s\u0131n\u0131f\u0131 tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\n\/\/ AuthDb i\u00e7in\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Models.Auth;\n\nnamespace YourNamespace.Data.Auth\n{\n    public class AuthDbContext : DbContext\n    {\n        public AuthDbContext(DbContextOptions<AuthDbContext> options) : base(options) { }\n        public DbSet<User> Users { get; set; }\n        public DbSet<Role> Roles { get; set; }\n    }\n}\n\n\/\/ CatalogDb i\u00e7in\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Models.Catalog;\n\nnamespace YourNamespace.Data.Catalog\n{\n    public class CatalogDbContext : DbContext\n    {\n        public CatalogDbContext(DbContextOptions<CatalogDbContext> options) : base(options) { }\n        public DbSet<Product> Products { get; set; }\n        public DbSet<Category> Categories { get; set; }\n    }\n}\n\n\/\/ OrderDb i\u00e7in\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Models.Order;\n\nnamespace YourNamespace.Data.Order\n{\n    public class OrderDbContext : DbContext\n    {\n        public OrderDbContext(DbContextOptions<OrderDbContext> options) : base(options) { }\n        public DbSet<Order> Orders { get; set; }\n        public DbSet<OrderItem> OrderItems { get; set; }\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, her <code>DbContext<\/code> kendi sorumluluk alan\u0131ndaki entity'leri i\u00e7eriyor. Bu, kod organizasyonunu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde iyile\u015ftirir ve her alan\u0131n ba\u011f\u0131ms\u0131z olarak geli\u015fmesine olanak tan\u0131r.<\/p>\n<h4>2. appsettings.json Dosyas\u0131n\u0131 G\u00fcncelleme<\/h4>\n<p>Her veritaban\u0131 i\u00e7in ayr\u0131 bir ba\u011flant\u0131 dizesi eklememiz gerekiyor:<\/p>\n<pre><code>\n{\n  \"ConnectionStrings\": {\n    \"AuthConnection\": \"Server=localhost;Database=AuthDb;User Id=sa;Password=YourStrongPassword;TrustServerCertificate=True\",\n    \"CatalogConnection\": \"Server=localhost;Database=CatalogDb;User Id=sa;Password=YourStrongPassword;TrustServerCertificate=True\",\n    \"OrderConnection\": \"Server=localhost;Database=OrderDb;User Id=sa;Password=YourStrongPassword;TrustServerCertificate=True\"\n  },\n  \/\/ ... di\u011fer ayarlar\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ba\u011flant\u0131 dizeleri, uygulaman\u0131n her bir <code>DbContext<\/code> i\u00e7in do\u011fru veritaban\u0131na ba\u011flanmas\u0131n\u0131 sa\u011flar. G\u00fcvenlik i\u00e7in, bu bilgilerin \u00fcretim ortam\u0131nda ortam de\u011fi\u015fkenleri veya Key Vault gibi g\u00fcvenli depolama \u00e7\u00f6z\u00fcmleri arac\u0131l\u0131\u011f\u0131yla sa\u011flanmas\u0131 gerekti\u011fini unutmay\u0131n.<\/p>\n<h4>3. DbContext'leri Dependency Injection'a Kaydetme<\/h4>\n<p><code>Program.cs<\/code> dosyas\u0131nda, her <code>DbContext<\/code>'i kendi ba\u011flant\u0131 dizesiyle DI konteynerine kaydetmeliyiz. Bu, uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerinin ihtiya\u00e7 duyduklar\u0131 <code>DbContext<\/code>'i kolayca almas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n\/\/ Program.cs\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Data.Auth;\nusing YourNamespace.Data.Catalog;\nusing YourNamespace.Data.Order;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ AuthDbContext'i kaydet\nbuilder.Services.AddDbContext<AuthDbContext>(options =>\n    options.UseSqlServer(builder.Configuration.GetConnectionString(\"AuthConnection\")));\n\n\/\/ CatalogDbContext'i kaydet\nbuilder.Services.AddDbContext<CatalogDbContext>(options =>\n    options.UseSqlServer(builder.Configuration.GetConnectionString(\"CatalogConnection\")));\n\n\/\/ OrderDbContext'i kaydet\nbuilder.Services.AddDbContext<OrderDbContext>(options =>\n    options.UseSqlServer(builder.Configuration.GetConnectionString(\"OrderConnection\")));\n\n\/\/ ... di\u011fer servisler ve uygulama yap\u0131land\u0131rmas\u0131\n    <\/pre>\n<p><\/code><\/p>\n<p>Her <code>DbContext<\/code> i\u00e7in <code>AddDbContext<\/code> metodunu \u00e7a\u011f\u0131rmak, EF Core'un her bir veritaban\u0131yla ayr\u0131 ayr\u0131 nas\u0131l etkile\u015fim kuraca\u011f\u0131n\u0131 bilmesini sa\u011flar. Bu yap\u0131land\u0131rma, uygulaman\u0131z\u0131n mod\u00fclerli\u011fini ve y\u00f6netilebilirli\u011fini art\u0131r\u0131r.<\/p>\n<h4>4. Migrasyonlar\u0131 Y\u00f6netme<\/h4>\n<p>Her <code>DbContext<\/code> i\u00e7in ayr\u0131 migrasyonlar y\u00f6netmeniz gerekecektir. .NET CLI komutlar\u0131n\u0131 kullan\u0131rken, hedef <code>DbContext<\/code>'i belirtmeniz \u00f6nemlidir. Bu, her veritaban\u0131n\u0131n \u015femas\u0131n\u0131 ba\u011f\u0131ms\u0131z olarak g\u00fcncellemenizi sa\u011flar.<\/p>\n<pre><code>\n# AuthDbContext i\u00e7in migrasyon olu\u015fturma\ndotnet ef migrations add InitialAuthMigration --context AuthDbContext --output-dir Data\/Auth\/Migrations\n\n# CatalogDbContext i\u00e7in migrasyon olu\u015fturma\ndotnet ef migrations add InitialCatalogMigration --context CatalogDbContext --output-dir Data\/Catalog\/Migrations\n\n# OrderDbContext i\u00e7in migrasyon olu\u015fturma\ndotnet ef migrations add InitialOrderMigration --context OrderDbContext --output-dir Data\/Order\/Migrations\n    <\/pre>\n<p><\/code><\/p>\n<p>Migrasyonlar\u0131 uygularken de ayn\u0131 \u015fekilde <code>--context<\/code> parametresini kullanmal\u0131s\u0131n\u0131z:<\/p>\n<pre><code>\ndotnet ef database update --context AuthDbContext\ndotnet ef database update --context CatalogDbContext\ndotnet ef database update --context OrderDbContext\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komutlar, her bir veritaban\u0131 i\u00e7in \u015fema de\u011fi\u015fikliklerini ayr\u0131 ayr\u0131 y\u00f6netmenizi sa\u011flar, b\u00f6ylece veritaban\u0131 ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 korursunuz ve olas\u0131 \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlersiniz.<\/p>\n<h4>5. DbContext'leri Kullanma<\/h4>\n<p>Art\u0131k uygulaman\u0131z\u0131n herhangi bir yerinde, \u00f6rne\u011fin bir denetleyici (controller) veya servis i\u00e7inde, ihtiyac\u0131n\u0131z olan <code>DbContext<\/code>'i ba\u011f\u0131ml\u0131l\u0131k olarak enjekte edebilirsiniz. Bu, i\u015f mant\u0131\u011f\u0131n\u0131z\u0131n belirli bir veriye eri\u015fim i\u00e7in do\u011fru veritaban\u0131na y\u00f6nlendirilmesini sa\u011flar.<\/p>\n<pre><code>\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.EntityFrameworkCore;\nusing YourNamespace.Data.Auth;\nusing YourNamespace.Data.Catalog;\nusing YourNamespace.Models.Catalog; \/\/ Product modelinizin bulundu\u011fu namespace\n\nnamespace YourNamespace.Controllers\n{\n    [ApiController]\n    [Route(\"[controller]\")]\n    public class ProductController : ControllerBase\n    {\n        private readonly CatalogDbContext _catalogDbContext;\n        private readonly AuthDbContext _authDbContext; \/\/ E\u011fer kullan\u0131c\u0131 bilgisi de gerekiyorsa\n\n        public ProductController(CatalogDbContext catalogDbContext, AuthDbContext authDbContext)\n        {\n            _catalogDbContext = catalogDbContext;\n            _authDbContext = authDbContext;\n        }\n\n        [HttpGet]\n        public async Task<IActionResult> GetProducts()\n        {\n            var products = await _catalogDbContext.Products.ToListAsync();\n            \/\/ ... belki _authDbContext.Users ile baz\u0131 kontroller yap\u0131l\u0131r\n            return Ok(products);\n        }\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n farkl\u0131 mod\u00fcllerinin kendi veritaban\u0131 sorumluluklar\u0131na sahip olmas\u0131n\u0131 sa\u011flar, b\u00f6ylece kod taban\u0131 daha anla\u015f\u0131l\u0131r, bak\u0131m\u0131 daha kolay ve \u00f6l\u00e7eklenebilir hale gelir. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda veya mikroservis mimarilerinde bu t\u00fcr bir ayr\u0131m b\u00fcy\u00fck avantajlar sunar. Bu, temiz mimari prensiplerine de uygun bir yakla\u015f\u0131md\u0131r.<\/p>\n<h2>Dinamik Ba\u011flant\u0131 Dizileri ve Ortam Tabanl\u0131 Yap\u0131land\u0131rma Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Bir uygulaman\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, haz\u0131rl\u0131k, \u00fcretim) \u00e7al\u0131\u015fmas\u0131 gerekti\u011finde, veritaban\u0131 ba\u011flant\u0131 dizelerinin de ortama g\u00f6re de\u011fi\u015fmesi hayati \u00f6nem ta\u015f\u0131r. Dinamik ba\u011flant\u0131 dizeleri ve ortam tabanl\u0131 yap\u0131land\u0131rma, bu esnekli\u011fi sa\u011flar. Bu sayede, ayn\u0131 kod taban\u0131n\u0131 kullanarak uygulaman\u0131z\u0131 farkl\u0131 veritaban\u0131 ortamlar\u0131na zahmetsizce da\u011f\u0131tabilirsiniz. Bu, CI\/CD s\u00fcre\u00e7lerinde de b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<h3>1. Ortam Tabanl\u0131 appsettings Dosyalar\u0131<\/h3>\n<p>.NET Core, varsay\u0131lan olarak ortam de\u011fi\u015fkenlerine dayal\u0131 yap\u0131land\u0131rma sa\u011flar. <code>appsettings.json<\/code> dosyas\u0131n\u0131n yan\u0131 s\u0131ra, ortama \u00f6zel dosyalar olu\u015fturabilirsiniz: \u00f6rne\u011fin, <code>appsettings.Development.json<\/code>, <code>appsettings.Staging.json<\/code> ve <code>appsettings.Production.json<\/code>. Bu dosyalar, <code>appsettings.json<\/code>'daki varsay\u0131lan de\u011ferleri ge\u00e7ersiz k\u0131lar ve b\u00f6ylece ortama \u00f6zel ayarlar yapman\u0131za olanak tan\u0131r.<\/p>\n<p>\u00d6rne\u011fin, <code>appsettings.json<\/code>'da varsay\u0131lan bir ba\u011flant\u0131 dizesi varken:<\/p>\n<pre><code>\n\/\/ appsettings.json\n{\n  \"ConnectionStrings\": {\n    \"DefaultConnection\": \"Server=localhost;Database=DevDb;User Id=sa;Password=YourStrongPassword;TrustServerCertificate=True\"\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\u00dcretim ortam\u0131 i\u00e7in <code>appsettings.Production.json<\/code> dosyan\u0131zda farkl\u0131 bir ba\u011flant\u0131 dizesi tan\u0131mlayabilirsiniz:<\/p>\n<pre><code>\n\/\/ appsettings.Production.json\n{\n  \"ConnectionStrings\": {\n    \"DefaultConnection\": \"Server=prod_db_server;Database=ProductionDb;User Id=prod_user;Password=ProdPassword;TrustServerCertificate=True\"\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Uygulaman\u0131z\u0131n hangi ortamda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 belirlemek i\u00e7in <code>ASPNETCORE_ENVIRONMENT<\/code> ortam de\u011fi\u015fkenini kullan\u0131r\u0131z. \u00d6rne\u011fin, Windows'ta <code>set ASPNETCORE_ENVIRONMENT=Production<\/code> veya Linux\/macOS'ta <code>export ASPNETCORE_ENVIRONMENT=Production<\/code> komutuyla ortam\u0131 ayarlayabilirsiniz. .NET Core uygulamas\u0131 ba\u015flat\u0131ld\u0131\u011f\u0131nda, bu ortam de\u011fi\u015fkenine g\u00f6re uygun <code>appsettings.{Environment}.json<\/code> dosyas\u0131n\u0131 otomatik olarak y\u00fckler ve ayarlar\u0131 birle\u015ftirir.<\/p>\n<h3>2. Ortam De\u011fi\u015fkenleri ile G\u00fcvenli Ba\u011flant\u0131 Dizeleri<\/h3>\n<p>\u00d6zellikle \u00fcretim ortamlar\u0131nda, hassas bilgileri (veritaban\u0131 \u015fifreleri gibi) do\u011frudan yap\u0131land\u0131rma dosyalar\u0131nda tutmak g\u00fcvenlik riski ta\u015f\u0131r. Bunun yerine, bu bilgileri <strong>ortam de\u011fi\u015fkenleri<\/strong> arac\u0131l\u0131\u011f\u0131yla sa\u011flamak \u00e7ok daha g\u00fcvenlidir. Ortam de\u011fi\u015fkenleri, uygulaman\u0131z\u0131n da\u011f\u0131t\u0131ld\u0131\u011f\u0131 sunucu veya kapsay\u0131c\u0131 ortam\u0131nda belirlenir ve uygulaman\u0131z taraf\u0131ndan okunabilir. Bu, hassas verilerin kaynak kontrol sistemlerine girmesini engeller.<\/p>\n<p>\u00d6rne\u011fin, bir sunucuda <code>ConnectionStrings__DefaultConnection<\/code> ad\u0131nda bir ortam de\u011fi\u015fkeni tan\u0131mlayabilirsiniz:<\/p>\n<pre><code>\n# Linux\/macOS\nexport ConnectionStrings__DefaultConnection=\"Server=env_db_server;Database=EnvironmentDb;User Id=env_user;Password=EnvPassword;TrustServerCertificate=True\"\n\n# Windows (Command Prompt)\nset ConnectionStrings__DefaultConnection=\"Server=env_db_server;Database=EnvironmentDb;User Id=env_user;Password=EnvPassword;TrustServerCertificate=True\"\n    <\/pre>\n<p><\/code><\/p>\n<p>.NET Core'daki yap\u0131land\u0131rma sistemi, otomatik olarak <code>__<\/code> (\u00e7ift alt \u00e7izgi) ile ayr\u0131lm\u0131\u015f ortam de\u011fi\u015fkenlerini i\u00e7 i\u00e7e yap\u0131land\u0131rma de\u011ferleri olarak yorumlar. Yani, yukar\u0131daki ortam de\u011fi\u015fkeni <code>ConnectionStrings:DefaultConnection<\/code> olarak eri\u015filebilir olacakt\u0131r. Bu mekanizma, yap\u0131land\u0131rma hiyerar\u015fisinde ortam de\u011fi\u015fkenlerine y\u00fcksek \u00f6ncelik verir.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: Bulut ortamlar\u0131nda (Azure App Service, AWS Elastic Beanstalk, Kubernetes vb.), ba\u011flant\u0131 dizelerini genellikle platformun kendi g\u00fcvenli yap\u0131land\u0131rma y\u00f6netim ara\u00e7lar\u0131 (\u00f6rne\u011fin, Azure Key Vault, AWS Secrets Manager) arac\u0131l\u0131\u011f\u0131yla sa\u011flars\u0131n\u0131z. Bu ara\u00e7lar, ba\u011flant\u0131 dizelerinin \u015fifreli olarak saklanmas\u0131n\u0131 ve sadece yetkili uygulamalar taraf\u0131ndan eri\u015filmesini sa\u011flar. Bu, en \u00fcst d\u00fczey g\u00fcvenlik yakla\u015f\u0131m\u0131d\u0131r.\n    <\/div>\n<h3>3. Dinamik DbContext Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Bazen uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131nda hangi veritaban\u0131na ba\u011flanaca\u011f\u0131na karar vermesi gerekebilir. \u00d6rne\u011fin, bir \u00e7ok kirac\u0131l\u0131 (multi-tenant) uygulamada, her kirac\u0131n\u0131n kendi veritaban\u0131 olabilir ve istek ba\u015f\u0131na do\u011fru veritaban\u0131na ba\u011flanmak gerekir. Bu senaryoda, <code>DbContext<\/code> yap\u0131land\u0131rmas\u0131n\u0131 dinamik hale getirebiliriz. Bu, uygulaman\u0131n kirac\u0131ya \u00f6zel davran\u0131\u015flar sergilemesini sa\u011flar.<\/p>\n<p>Bunu yapmak i\u00e7in, <code>DbContextOptions<\/code>'\u0131 do\u011frudan enjekte etmek yerine, ba\u011flant\u0131 dizesini bir servis arac\u0131l\u0131\u011f\u0131yla sa\u011flamay\u0131 d\u00fc\u015f\u00fcnebiliriz:<\/p>\n<pre><code>\n\/\/ Program.cs\nbuilder.Services.AddScoped<IConnectionStringProvider, TenantConnectionStringProvider>();\n\nbuilder.Services.AddDbContext<ApplicationDbContext>((serviceProvider, options) =>\n{\n    var connectionStringProvider = serviceProvider.GetRequiredService<IConnectionStringProvider>();\n    var connectionString = connectionStringProvider.GetConnectionString(); \/\/ Kirac\u0131ya \u00f6zel ba\u011flant\u0131 dizesini al\n    options.UseSqlServer(connectionString);\n});\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>IConnectionStringProvider<\/code> ad\u0131nda bir aray\u00fcz ve bunu uygulayan bir servis tan\u0131mlaman\u0131z gerekecektir. Bu servis, mevcut HTTP iste\u011fine veya kullan\u0131c\u0131n\u0131n kimli\u011fine g\u00f6re do\u011fru ba\u011flant\u0131 dizesini belirleyebilir. Bu, olduk\u00e7a ileri d\u00fczey bir senaryodur ancak b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda inan\u0131lmaz bir esneklik sunar. Bu yap\u0131, uygulaman\u0131n dinamik gereksinimlere uyum sa\u011flamas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Ortam tabanl\u0131 ve dinamik ba\u011flant\u0131 dizeleri y\u00f6netimi, uygulaman\u0131z\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 basitle\u015ftirir, g\u00fcvenlik duru\u015funu g\u00fc\u00e7lendirir ve farkl\u0131 operasyonel ortamlara uyum sa\u011flama yetene\u011fini art\u0131r\u0131r. Bu stratejileri do\u011fru bir \u015fekilde uygulamak, uzun vadede projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir ve bak\u0131m maliyetlerini azalt\u0131r.<\/p>\n<h2>Performans ve G\u00fcvenlik \u0130pu\u00e7lar\u0131: SQL Server \u00c7oklu Veritaban\u0131 Yap\u0131land\u0131rmas\u0131<\/h2>\n<p>\u00c7oklu veritaban\u0131 yap\u0131land\u0131rmas\u0131, uygulaman\u0131za esneklik ve \u00f6l\u00e7eklenebilirlik katarken, performans ve g\u00fcvenlik konular\u0131nda dikkatli olunmas\u0131 gereken yeni katmanlar ekler. Bu b\u00f6l\u00fcmde, SQL Server tabanl\u0131 \u00e7oklu veritaban\u0131 kurulumlar\u0131n\u0131z\u0131n hem h\u0131zl\u0131 hem de g\u00fcvenli olmas\u0131n\u0131 sa\u011flayacak \u00f6nemli ipu\u00e7lar\u0131n\u0131 ve en iyi uygulamalar\u0131 ele alaca\u011f\u0131z. Bu \u00f6neriler, uygulaman\u0131z\u0131n \u00fcretimde sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 temin edecektir.<\/p>\n<h3>Performans Optimizasyonlar\u0131<\/h3>\n<p>Veritaban\u0131 i\u015flemleri, genellikle bir uygulaman\u0131n en yava\u015f k\u0131sm\u0131d\u0131r. Bu nedenle, performans optimizasyonlar\u0131 kritik \u00f6neme sahiptir. \u0130yi optimize edilmi\u015f bir veritaban\u0131, uygulaman\u0131z\u0131n genel h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<ul>\n<li>\n            <strong>Ba\u011flant\u0131 Havuzu (Connection Pooling):<\/strong> EF Core ve ADO.NET, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 yeniden kullanmak i\u00e7in otomatik olarak ba\u011flant\u0131 havuzlama (connection pooling) kullan\u0131r. Bu, her istek i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7\u0131p kapatma maliyetini ortadan kald\u0131r\u0131r. Ancak, ba\u011flant\u0131 dizelerinizdeki parametrelerin (\u00f6zellikle g\u00fcvenlik veya \u015fifreleme ile ilgili olanlar) tutarl\u0131 oldu\u011fundan emin olun, aksi takdirde havuzlama d\u00fczg\u00fcn \u00e7al\u0131\u015fmayabilir. Farkl\u0131 veritabanlar\u0131 i\u00e7in farkl\u0131 ba\u011flant\u0131 dizeleri kulland\u0131\u011f\u0131n\u0131zda, her havuz ba\u011f\u0131ms\u0131z olacakt\u0131r, bu normaldir ve performans\u0131 olumsuz etkilemez.\n        <\/li>\n<li>\n            <strong>Uygun \u0130ndeksleme:<\/strong> Sorgular\u0131n\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak i\u00e7in veritaban\u0131 tablolar\u0131n\u0131zda uygun indeksler olu\u015fturun. S\u0131k\u00e7a sorgulanan s\u00fctunlara (\u00f6zellikle <code>WHERE<\/code>, <code>JOIN<\/code> ve <code>ORDER BY<\/code> ko\u015fullar\u0131nda kullan\u0131lanlar) indeks eklemek, veri eri\u015fim s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir. EF Core migrasyonlar\u0131 arac\u0131l\u0131\u011f\u0131yla indeksleri tan\u0131mlayabilir veya do\u011frudan veritaban\u0131nda olu\u015fturabilirsiniz. Do\u011fru indeks stratejisi, b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<pre><code>\n\/\/ EF Core'da indeks tan\u0131mlama \u00f6rne\u011fi\nmodelBuilder.Entity<Product>()\n    .HasIndex(p => p.Name); \/\/ Product.Name s\u00fctununa indeks ekle\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li>\n            <strong>Sorgu Optimizasyonu:<\/strong> Karma\u015f\u0131k sorgular\u0131 basitle\u015ftirin ve gereksiz join'lerden ka\u00e7\u0131n\u0131n. EF Core'u kullan\u0131rken, <code>Include()<\/code> metoduyla ili\u015fkili verileri y\u00fcklerken dikkatli olun. \u00c7ok fazla veri y\u00fcklemek performans sorunlar\u0131na yol a\u00e7abilir. Gerekti\u011finde <code>Select()<\/code> ile sadece ihtiyac\u0131n\u0131z olan s\u00fctunlar\u0131 \u00e7ekin. Asenkron (<code>async\/await<\/code>) metotlar\u0131 kullanarak UI'\u0131n veya uygulaman\u0131n di\u011fer b\u00f6l\u00fcmlerinin veritaban\u0131 i\u015flemlerini beklemeden \u00e7al\u0131\u015fmaya devam etmesini sa\u011flay\u0131n, bu da kullan\u0131c\u0131 deneyimini iyile\u015ftirir.\n        <\/li>\n<li>\n            <strong>\u00d6nbellekleme (Caching):<\/strong> S\u0131k\u00e7a eri\u015filen ancak nadiren de\u011fi\u015fen veriler i\u00e7in uygulama d\u00fczeyinde veya da\u011f\u0131t\u0131lm\u0131\u015f \u00f6nbellekleme kullan\u0131n. Redis veya Memcached gibi \u00e7\u00f6z\u00fcmlerle veritaban\u0131na olan y\u00fck\u00fc azaltabilir ve yan\u0131t s\u00fcrelerini iyile\u015ftirebilirsiniz. Her veritaban\u0131 i\u00e7in ayr\u0131 \u00f6nbellek stratejileri d\u00fc\u015f\u00fcnebilirsiniz. \u00d6nbellekleme, veritaban\u0131 sunucular\u0131n\u0131n \u00fczerindeki bask\u0131y\u0131 azaltman\u0131n etkili bir yoludur.\n        <\/li>\n<li>\n            <strong>SQL Server Performans \u0130zleme:<\/strong> SQL Server Profiler, Extended Events, Dinamik Y\u00f6netim G\u00f6r\u00fcn\u00fcmleri (DMVs) gibi ara\u00e7larla veritaban\u0131n\u0131z\u0131n performans\u0131n\u0131 s\u00fcrekli izleyin. Yava\u015f \u00e7al\u0131\u015fan sorgular\u0131 tespit edin ve bunlar\u0131 optimize edin. S\u00fcrekli izleme, potansiyel performans darbo\u011fazlar\u0131n\u0131 erken a\u015famada belirlemenize yard\u0131mc\u0131 olur.\n        <\/li>\n<\/ul>\n<h3>G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h3>\n<p>Veritaban\u0131 g\u00fcvenli\u011fi, uygulaman\u0131z\u0131n genel g\u00fcvenli\u011finin temelini olu\u015fturur. \u00c7oklu veritaban\u0131 ortam\u0131nda her veritaban\u0131n\u0131n kendi g\u00fcvenlik duru\u015fu olmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc her birinin farkl\u0131 hassasiyette verilere sahip olmas\u0131 muhtemeldir.<\/p>\n<ul>\n<li>\n            <strong>En Az Yetki Prensibi:<\/strong> Uygulaman\u0131z\u0131n veritaban\u0131na ba\u011flanmak i\u00e7in kulland\u0131\u011f\u0131 kullan\u0131c\u0131 hesaplar\u0131na sadece ihtiya\u00e7 duyduklar\u0131 minimum yetkileri verin. \u00d6rne\u011fin, bir kullan\u0131c\u0131 sadece \u00fcr\u00fcnleri okuyorsa, ona sadece okuma (SELECT) yetkisi verin, yazma (INSERT, UPDATE, DELETE) yetkisi vermeyin. Her veritaban\u0131 (AuthDb, CatalogDb, OrderDb) i\u00e7in ayr\u0131 ve \u00f6zelle\u015ftirilmi\u015f kullan\u0131c\u0131lar ve roller tan\u0131mlay\u0131n. Bu, bir g\u00fcvenlik ihlali durumunda etki alan\u0131n\u0131 s\u0131n\u0131rlar.\n        <\/li>\n<li>\n            <strong>SQL Enjeksiyonuna Kar\u015f\u0131 Korunma:<\/strong> Entity Framework Core gibi ORM'ler, parametreli sorgular\u0131 otomatik olarak kullanarak SQL enjeksiyon sald\u0131r\u0131lar\u0131na kar\u015f\u0131 do\u011fal bir koruma sa\u011flar. Ancak, do\u011frudan SQL sorgular\u0131 yaz\u0131yorsan\u0131z (<code>FromSqlRaw<\/code> veya <code>ExecuteSqlRaw<\/code> gibi metotlarla), parametreleri dikkatlice kullanmal\u0131 ve asla kullan\u0131c\u0131 giri\u015fini do\u011frudan SQL sorgusuna katmamal\u0131s\u0131n\u0131z. OWASP Top 10 listesinde \u00fcst s\u0131ralarda yer alan bu zafiyetten korunmak kritik \u00f6neme sahiptir.<\/p>\n<pre><code>\n\/\/ G\u00fcvenli kullan\u0131m (parametreli sorgu)\nvar products = await _catalogDbContext.Products\n    .FromSqlRaw(\"SELECT * FROM Products WHERE CategoryId = {0}\", categoryId)\n    .ToListAsync();\n\n\/\/ K\u00d6T\u00dc KULLANIM (SQL Enjeksiyonuna a\u00e7\u0131k)\n\/\/ var products = await _catalogDbContext.Products.FromSqlRaw($\"SELECT * FROM Products WHERE CategoryId = {categoryId}\").ToListAsync();\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li>\n            <strong>Hassas Veri \u015eifrelemesi:<\/strong> M\u00fc\u015fteri bilgileri, kredi kart\u0131 numaralar\u0131, \u015fifreler gibi hassas verileri veritaban\u0131nda \u015fifreli olarak saklay\u0131n. SQL Server'\u0131n \u015feffaf veri \u015fifrelemesi (TDE) veya Always Encrypted gibi \u00f6zellikleri, verilerin depolama ve iletim s\u0131ras\u0131nda korunmas\u0131na yard\u0131mc\u0131 olur. Uygulama katman\u0131nda da hassas verileri \u015fifreleyip \u00e7\u00f6zebilirsiniz. Bu, veri ihlali durumunda bile verilerin korunmas\u0131n\u0131 sa\u011flar.\n        <\/li>\n<li>\n            <strong>Ba\u011flant\u0131 Dizelerini Koruma:<\/strong> Ba\u011flant\u0131 dizelerinizi asla kaynak kodda veya herkese a\u00e7\u0131k yap\u0131land\u0131rma dosyalar\u0131nda saklamay\u0131n. Ortam de\u011fi\u015fkenleri, bulut tabanl\u0131 anahtar y\u00f6netim sistemleri (Azure Key Vault, AWS Secrets Manager) veya .NET Secret Manager gibi g\u00fcvenli y\u00f6ntemleri kullan\u0131n. Bu yakla\u015f\u0131m, kimlik bilgilerinin \u00e7al\u0131nma riskini minimize eder.\n        <\/li>\n<li>\n            <strong>G\u00fcvenlik Denetimleri ve G\u00fcnl\u00fckleme:<\/strong> Veritaban\u0131 eri\u015fimlerini ve de\u011fi\u015fikliklerini denetlemek i\u00e7in kapsaml\u0131 g\u00fcnl\u00fckleme (logging) uygulay\u0131n. SQL Server denetim \u00f6zelliklerini kullanarak kimin ne zaman hangi verilere eri\u015fti\u011fini veya de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131 izleyin. Anormal aktiviteyi tespit etmek i\u00e7in bu g\u00fcnl\u00fckleri d\u00fczenli olarak inceleyin.\n        <\/li>\n<li>\n            <strong>A\u011f G\u00fcvenli\u011fi:<\/strong> Veritaban\u0131 sunucular\u0131na eri\u015fimi k\u0131s\u0131tlay\u0131n. G\u00fcvenlik duvarlar\u0131 (firewalls) kullanarak sadece uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 sunucular\u0131n veya belirli IP adreslerinin veritaban\u0131 sunucular\u0131na eri\u015fmesine izin verin. Veritaban\u0131 ileti\u015fimini SSL\/TLS \u00fczerinden \u015fifrelemeyi sa\u011flay\u0131n. Bu, a\u011f d\u00fczeyinde yetkisiz eri\u015fimi engeller.\n        <\/li>\n<\/ul>\n<p>Bu performans ve g\u00fcvenlik ipu\u00e7lar\u0131n\u0131 uygulayarak, \u00e7oklu SQL Server veritaban\u0131 kurulumlar\u0131n\u0131z\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda sa\u011flam, h\u0131zl\u0131 ve d\u0131\u015f tehditlere kar\u015f\u0131 diren\u00e7li olmas\u0131n\u0131 sa\u011flayabilirsiniz. Unutmay\u0131n, g\u00fcvenlik ve performans tek seferlik eylemler de\u011fil, s\u00fcrekli dikkat ve optimizasyon gerektiren s\u00fcre\u00e7lerdir. Bu yakla\u015f\u0131mlar, uygulaman\u0131z\u0131n uzun \u00f6m\u00fcrl\u00fc ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fe Y\u00f6nelik Dayan\u0131kl\u0131 Bir Mimari<\/h2>\n<p>Modern uygulamalar\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 ve de\u011fi\u015fen i\u015f gereksinimleri, esnek ve \u00f6l\u00e7eklenebilir veritaban\u0131 stratejilerini zorunlu k\u0131lmaktad\u0131r. Bu makalede ele ald\u0131\u011f\u0131m\u0131z gibi, .NET tabanl\u0131 uygulamalar\u0131n\u0131za SQL Server deste\u011fi eklemek ve \u00e7oklu veritaban\u0131 kurulumlar\u0131n\u0131 y\u00f6netmek, uygulaman\u0131z\u0131n gelece\u011fe y\u00f6nelik dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Tek bir veritaban\u0131 sa\u011flay\u0131c\u0131s\u0131na ba\u011fl\u0131 kalmadan, farkl\u0131 i\u015f domainleri i\u00e7in optimize edilmi\u015f veri depolama \u00e7\u00f6z\u00fcmleri sunarak hem performans\u0131 art\u0131rabilir hem de bak\u0131m kolayl\u0131\u011f\u0131 sa\u011flayabilirsiniz. Bu sayede, uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca esnekli\u011fini korursunuz.<\/p>\n<p>Ad\u0131m ad\u0131m g\u00f6sterdi\u011fimiz gibi, Entity Framework Core'un sa\u011flad\u0131\u011f\u0131 soyutlama katman\u0131 sayesinde, farkl\u0131 <code>DbContext<\/code> s\u0131n\u0131flar\u0131 tan\u0131mlayarak ve bunlar\u0131 Dependency Injection ile do\u011fru bir \u015fekilde y\u00f6neterek \u00e7oklu veritaban\u0131 senaryolar\u0131n\u0131 ba\u015far\u0131yla hayata ge\u00e7irebilirsiniz. Ayr\u0131ca, dinamik ba\u011flant\u0131 dizeleri ve ortam tabanl\u0131 yap\u0131land\u0131rma stratejileri, uygulaman\u0131z\u0131n farkl\u0131 da\u011f\u0131t\u0131m ortamlar\u0131na sorunsuz bir \u015fekilde adapte olmas\u0131n\u0131 g\u00fcvence alt\u0131na al\u0131r. Son olarak, performans optimizasyonlar\u0131 ve s\u0131k\u0131 g\u00fcvenlik \u00f6nlemleri, uygulaman\u0131z\u0131n sadece h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve gizlili\u011fini de korumas\u0131n\u0131 sa\u011flar. Bu b\u00fct\u00fcnsel yakla\u015f\u0131m, uygulaman\u0131z\u0131n genel kalitesini y\u00fckseltir.<\/p>\n<p>Unutmay\u0131n ki \u00e7oklu veritaban\u0131 mimarisi, do\u011fru uyguland\u0131\u011f\u0131nda b\u00fcy\u00fck avantajlar sunar, ancak ayn\u0131 zamanda daha fazla yap\u0131land\u0131rma ve y\u00f6netim karma\u015f\u0131kl\u0131\u011f\u0131 da beraberinde getirir. Bu nedenle, her ad\u0131mda dikkatli olmak ve en iyi uygulamalar\u0131 takip etmek, projenizin uzun vadeli ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Bu rehberin, .NET uygulamalar\u0131n\u0131za SQL Server deste\u011fi ekleme ve sa\u011flam bir \u00e7oklu veritaban\u0131 altyap\u0131s\u0131 kurma yolculu\u011funuzda size rehberlik etmesini umuyoruz. Ba\u015far\u0131l\u0131 ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirmeniz dile\u011fiyle.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Birden fazla <code>DbContext<\/code> kullanmak uygulaman\u0131n performans\u0131n\u0131 nas\u0131l etkiler?<\/dt>\n<dd>Birden fazla <code>DbContext<\/code> kullanmak, genellikle performans \u00fczerinde do\u011frudan olumsuz bir etkiye sahip de\u011fildir. Aksine, her <code>DbContext<\/code> kendi veritaban\u0131 sorumluluk alan\u0131yla s\u0131n\u0131rl\u0131 oldu\u011fu i\u00e7in sorgular\u0131n daha hedefli olmas\u0131n\u0131 sa\u011flar ve veritaban\u0131 ba\u011flant\u0131 havuzlamas\u0131 her <code>DbContext<\/code> i\u00e7in ayr\u0131 ayr\u0131 y\u00f6netildi\u011fi i\u00e7in etkin bir \u015fekilde kaynak kullan\u0131l\u0131r. Performans sorunlar\u0131 genellikle yanl\u0131\u015f sorgulama, eksik indeksleme veya a\u015f\u0131r\u0131 veri y\u00fcklemesinden kaynaklan\u0131r, <code>DbContext<\/code> say\u0131s\u0131ndan de\u011fil. Do\u011fru yap\u0131land\u0131rma ile performans art\u0131\u015f\u0131 bile g\u00f6zlemlenebilir.<\/dd>\n<dt>Her veritaban\u0131 i\u00e7in ayr\u0131 migrasyonlar\u0131 nas\u0131l y\u00f6netirim?<\/dt>\n<dd>Her <code>DbContext<\/code> i\u00e7in ayr\u0131 migrasyonlar\u0131 y\u00f6netmek i\u00e7in .NET CLI komutlar\u0131n\u0131 kullan\u0131rken <code>--context<\/code> parametresini belirtmeniz gerekir. \u00d6rne\u011fin, <code>dotnet ef migrations add InitialAuthMigration --context AuthDbContext<\/code>. Bu, EF Core'un hangi <code>DbContext<\/code> s\u0131n\u0131f\u0131 i\u00e7in migrasyon olu\u015fturaca\u011f\u0131n\u0131 veya uygulayaca\u011f\u0131n\u0131 bilmesini sa\u011flar. Her <code>DbContext<\/code>'in kendi migrasyon klas\u00f6r\u00fc olmas\u0131 tavsiye edilir. Bu, migrasyonlar\u0131 daha d\u00fczenli ve \u00e7ak\u0131\u015fmas\u0131z y\u00f6netmenizi sa\u011flar.<\/dd>\n<dt>\u00c7oklu veritaban\u0131 kurulumunda g\u00fcvenlik riskleri nelerdir?<\/dt>\n<dd>\u00c7oklu veritaban\u0131 ortam\u0131nda g\u00fcvenlik riskleri artabilir \u00e7\u00fcnk\u00fc y\u00f6netilmesi gereken daha fazla ba\u011flant\u0131 dizesi ve eri\u015fim noktas\u0131 vard\u0131r. Ana riskler aras\u0131nda yetkisiz eri\u015fim (zay\u0131f kimlik bilgileri), SQL enjeksiyonu (do\u011frudan SQL kullan\u0131l\u0131yorsa), veri if\u015fas\u0131 (\u015fifresiz hassas veri) ve yanl\u0131\u015f yetkilendirme (gere\u011finden fazla yetki verilmesi) bulunur. En az yetki prensibi, ba\u011flant\u0131 dizelerinin g\u00fcvenli y\u00f6netimi ve parametreli sorgular\u0131n kullan\u0131m\u0131 bu riskleri azaltmak i\u00e7in kritik \u00f6neme sahiptir. Her veritaban\u0131 i\u00e7in ayr\u0131 g\u00fcvenlik denetimleri \u00f6nemlidir.<\/dd>\n<dt>Farkl\u0131 veritaban\u0131 t\u00fcrlerini (\u00f6rn. SQL Server ve PostgreSQL) ayn\u0131 uygulamada kullanabilir miyim?<\/dt>\n<dd>Evet, Entity Framework Core ile bu m\u00fcmk\u00fcnd\u00fcr. Her farkl\u0131 veritaban\u0131 t\u00fcr\u00fc i\u00e7in ayr\u0131 bir <code>DbContext<\/code> s\u0131n\u0131f\u0131 ve ilgili EF Core sa\u011flay\u0131c\u0131 paketini (\u00f6rn. <code>Microsoft.EntityFrameworkCore.SqlServer<\/code> ve <code>Npgsql.EntityFrameworkCore.PostgreSQL<\/code>) y\u00fcklemeniz gerekir. Ard\u0131ndan, her <code>DbContext<\/code>'i kendi sa\u011flay\u0131c\u0131s\u0131 ve ba\u011flant\u0131 dizesiyle DI konteynerine kaydederek kullanabilirsiniz. Bu, mikroservis mimarilerinde s\u0131k\u00e7a g\u00f6r\u00fclen bir yakla\u015f\u0131md\u0131r ve uygulaman\u0131za teknoloji esnekli\u011fi kazand\u0131r\u0131r.<\/dd>\n<dt>Mobil uyumlu HTML'den bahsettiniz, bunun \u00e7oklu veritaban\u0131 kurulumuyla ne ilgisi var?<\/dt>\n<dd>Makalede mobil uyumlu HTML'in direkt olarak \u00e7oklu veritaban\u0131 kurulumuyla teknik bir ba\u011flant\u0131s\u0131 yoktur. Ancak, modern web uygulamalar\u0131 genellikle API tabanl\u0131 arka u\u00e7larla ileti\u015fim kurar. Veritaban\u0131 taraf\u0131nda performans ve g\u00fcvenlik optimizasyonlar\u0131 yapmak, mobil uygulaman\u0131n API \u00e7a\u011fr\u0131lar\u0131na daha h\u0131zl\u0131 ve g\u00fcvenli yan\u0131t almas\u0131n\u0131 sa\u011flar. Dolay\u0131s\u0131yla, g\u00fc\u00e7l\u00fc bir arka u\u00e7 mimarisi (\u00e7oklu veritaban\u0131 deste\u011fi dahil) dolayl\u0131 olarak mobil kullan\u0131c\u0131 deneyimini de iyile\u015ftirir. Ayr\u0131ca, genel bir web geli\u015ftirme makalesi format\u0131nda mobil uyumlulu\u011fun \u00f6nemi vurgulanm\u0131\u015ft\u0131r, \u00e7\u00fcnk\u00fc arka u\u00e7 ne kadar iyi olursa olsun, \u00f6n y\u00fcz de modern standartlara uygun olmal\u0131d\u0131r.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[874],"tags":[],"class_list":{"0":"post-33037","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-server","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?<\/title>\n<meta name=\"description\" content=\"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server&#039;\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server&#039;\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T18:02:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?\",\"datePublished\":\"2025-10-28T18:02:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\"},\"wordCount\":5226,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Server\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\",\"name\":\"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-28T18:02:53+00:00\",\"description\":\"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server'\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?","description":"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server'\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/","og_locale":"tr_TR","og_type":"article","og_title":"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?","og_description":"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server'\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.","og_url":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-28T18:02:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?","datePublished":"2025-10-28T18:02:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/"},"wordCount":5226,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Server"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/","url":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/","name":"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-28T18:02:53+00:00","description":"Modern uygulamalar, de\u011fi\u015fen i\u015f y\u00fcklerine ve \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131na uyum sa\u011flamak zorundad\u0131r. Peki, uygulaman\u0131z\u0131n farkl\u0131 veritaban\u0131 sistemlerini, \u00f6zellikle de SQL Server'\u0131 desteklemesi gerekti\u011finde nas\u0131l bir yol izlemelisiniz? Bu makalede, .NET tabanl\u0131 bir uygulamaya SQL Server deste\u011fini nas\u0131l ekleyece\u011finizi ve \u00e7oklu veritaban\u0131 ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ke\u015ffedeceksiniz. Bu rehber, sizi s\u0131f\u0131rdan al\u0131p karma\u015f\u0131k \u00e7oklu veritaban\u0131 mimarilerine kadar g\u00f6t\u00fcrecektir.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/sql-server-destegi-ekleme-coklu-veritabani-kurulumu-nasil-yapilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Server Deste\u011fi Ekleme: \u00c7oklu Veritaban\u0131 Kurulumu Nas\u0131l Yap\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33037"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33037\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}