Entity Framework Veritabanı İşlemleri Yaklaşımları 1 – Database First

Entity Framework ile uygulama geliştirirken üç farklı yaklaşımdan birini kullanabiliriz. Bu yaklaşımlar aşağıdakiler gibidir. Bugün birlikte örneklerle beraber Database First’ü öğreneceğiz.

  • Database First
  • Model First
  • Code First
  1. Database First

Eğer hali hazırda bir veritabanımız varsa ve bu veritabanı uzun zamandır kullanılıyorsa bu yaklaşım tercih edilir. Bu yaklaşım diğer yaklaşımların aksine zaten olan bir veritabanı üzerinden çalışma yapılması mantığına göre işler. Tabi bu yaklaşımı daha önce veritabanınız olmasada kullanabilirsiniz, bunun için veritabanını klasik yöntemlere göre sql server üzerinden oluşturmalısınız.Bu yöntemde database üzerinde herhangi bir değişiklik yapmak istersek, sql server üzerinden manual olarak yapmalıyız. Bu durumun projeye yansıması içinse “update model from database” tıklamamız gerekli. Veritabanındaki tabloları ve verileri kullanırız. (Visual Studio yerine SSMS Kullanırız.) Kod yazmadan hazır görünümle sağlanır.

  1. ASP.NET Web Application (.NET Framework) Örneği:

File -> New -> Project yolunu takip ediniz. Resimde en üstte olanı seçiniz.

Daha Sonra Proje İsmi ve Lokasyonunu Belirtiniz. Projede MVC olanı seçiniz.

Tablolarımızı SSMS üzerinden oluşturup, tablolarımıza düzenlemeden veri girişleri yapalım. Örnek projeye tablonun yedeğini ekleyeceğim, bu kısım .CORE için de ortaktır. Mevki, Oyuncu ,Takım ,Ülke tabloları sırasıyla aşağıdaki gibidir.

Database Diagram oluşturup aşağıdaki Tablo ilişkilendirmelerini yapmayı unutmayalım.

Daha sonra Models -> Add -> New Item’dan ADO.NET Entity Data Model’i seçelim. Model adımızı verdikten sonra Add’e tıklayalım. Bu adımdan sonra açılacak pencereden EF Designer from datayı seçelim.

Yukarıdaki adımları tamamladıktan sonra açılan pencereden New Connection’u seçelim.

Açılan pencereden Server Name kısmına Veritabanı bağlantı adınızı, veritabanı adı kısmına da kullanacağınız veritabanı seçilir listeden seçiniz.

Advanced kısmından veritabanı bağlantı bilgimizi öğrenip bunu kopyalayalım.

Örneğin: Data Source=DESKTOP-OMV8BFU\SQLEXPRESS;Initial Catalog=DatabaseFirst;Integrated Security=True bendeki bu şekilde..

İşlemleri tamamladıktan sonra aşağıdaki görünüm ortaya çıkacaktır. Entities isimlendirmesi size kalmıştır.

Açılan pencereden Entity Framework’ün versiyonunu seçeceğiz. 6 veya 5 geldi ben 6 seçtim. Devamında Tablolarımızın tamamını ve altta yer alan 2 tiki seçelim. Foreign key olayını otomatik yapacak ve isimlendirmelerde s takısı eklemek için kullanacağız. Siz isterseniz kendinize göre ayarlayabilirsiniz. Model Namespaceini de ayarlamayı unutmayalım. Finish diyerek tamamlayalım. Hata gelirse OK diyerek geçelim.

Model içerisinde .edmx dosyasında bizim diyagramımız ve tablolarımız otomatik oluşturulacaktır. Sonra projemizi rebuild edelim.

Aşağıdaki kodu HomeControllera yazalım. Listeleye sağ tıklayıp Add View dediğimizde 2. resim açılacaktır onun da bilgilerini girince kendisine otomatik view oluşturur. Bu viewda istediğimiz listelemeyi görebiliriz. (3. Resim /Home/Listele urline gittiğimizde gözükecektir. )

Conrollera sağ tıklayıp Add dediğimizde aşağıdaki resim açılmaktadır, seçilenleri seçelim. /Oyuncu/Index yönlendirmesine gidelim. Buradan Add,Edit,Update işlemlerinizi yapabilirsiniz. Yukarıdaki Resim buna örnektir.

Projeyi İndirmek İçin : https://github.com/berkaykanca78/DatabaseFirstNETFramework

2. ASP.NET Core Web Application (.NET Core) Örneği:

Bu sefer projemizi oluşturuken ASP.NET Core Web Application için seçelim, versiyonunuzu da seçin. (Ben 3.1 seçtim kendi projemde.)

Nuget Package Manager Console :
1. dotnet add package Microsoft.EntityFrameworkCore.SqlServer yazıp kuralım,
2. Install-Package Microsoft.EntityFrameworkCore.Tools yazıp kuralım,
3. Scaffold-DbContext "Server=DESKTOP-OMV8BFU\SQLEXPRESS;Database=DatabaseFirst;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models (Not: Burada server kısmına kendi sunucu bilginizi,Database kısmına da veritabanı bilginizi yazınız.) Contextimiz hazırdır.
4. Scaffold-DbContext "Server=DESKTOP-OMV8BFU\SQLEXPRESS;Database=DatabaseFirst;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -force (Veritabanında herhangi bir değişiklik olduğunda bu kodu kullanalım.)

Startup:
using DatabaseFirstCore.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DatabaseFirstCore
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<DatabaseFirstContext>(_ => _.UseSqlServer("Server=DESKTOP-OMV8BFU\\SQLEXPRESS;Database=DatabaseFirst;Trusted_Connection=True;"));
            services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}


HomeController.cs:
using DatabaseFirstCore.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using System.Linq;

namespace DatabaseFirstCore.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        DatabaseFirstContext _context;

        public HomeController(ILogger<HomeController> logger, DatabaseFirstContext context)
        {
            _logger = logger;
            _context = context;
        }

        public IActionResult Index()
        {
return View(from Oyuncu in _context.Oyuncus
                         join Mevki in _context.Mevkis on Oyuncu.Mevki equals Mevki.Id
                         join Takim in _context.Takims on Oyuncu.TakimId equals Takim.Id
                         join Ulke in _context.Ulkes on Oyuncu.Ulke equals Ulke.Id
                         select new ListeViewModel
                         {
                             Adi = Oyuncu.Adi,
                             Maas = Oyuncu.Maas,
                             MevkiAdi = Mevki.MevkiAdi,
                             Soyadi = Oyuncu.Soyadi,
                             SozlesmeSuresi = Oyuncu.SozlesmeSuresi,
                             TakimAdi = Takim.TakimAdi,
                             UlkeAdi = Ulke.UlkeAdi,
                             Yasi = Oyuncu.Yasi,
                         }
);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

Index.cshtml:
@model IEnumerable<ListeViewModel>

<div class="text-center">
    <div>
        <table class="table">
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Adi)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Soyadi)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Yasi)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Maas)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.SozlesmeSuresi)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.MevkiAdi)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.UlkeAdi)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.TakimAdi)
                </th>
            </tr>

            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Adi)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Soyadi)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Yasi)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Maas)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.SozlesmeSuresi)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.MevkiAdi)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.UlkeAdi)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.TakimAdi)
                    </td>
                </tr>
            }

        </table>
    </div>
</div>

ListeViewModel.cs Models klasörüne ekleyelim:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DatabaseFirstCore.Models
{
    public class ListeViewModel
    {
        public string Adi { get; set; }
        public string Soyadi { get; set; }
        public int Yasi { get; set; }
        public string MevkiAdi { get; set; }
        public decimal Maas { get; set; }
        public int SozlesmeSuresi { get; set; }
        public string UlkeAdi { get; set; }
        public string TakimAdi { get; set; }

    }
}

Projemizin Görüntüsü Aşağıdaki Gibidir.

Projeyi İndirmek İçin : https://github.com/berkaykanca78/DatabaseFirstNETCore

Not: Veritabanı yedeği Proje içinde DatabaseFirst.bak içerisindedir. SQL Server’a import edebilirisniz.

Kaynaklar:

Mehmet Akif Vurucu : https://www.youtube.com/watch?v=ONw9ANS0Lvs

https://www.gencayyildiz.com/blog/entity-framework-core-lazy-loading/

https://www.gencayyildiz.com/blog/asp-net-core-uygulamalarinda-database-first-yaklasimi-ile-mevcut-veritabaninda-calisma/