Bu yazıda Entity Framework (EF) kullanarak Sqlite veritabanına Asp.NET Core ile nasıl bağlanılır konusuyla ilgili bilgiler yer alıyor.
Uygulama Açıklama: Öğrenci Sınav Uygulaması için öğrenci adı soyadı, 1 ve 2. sınav notlarını için ilgili alanlar içeren uygulamayı sqlite veritabanı ile kayıt, listeleme, tekil gösterme, silme, güncelleme gibi işlemleri en basit haliyle yapılması anlatılacak.
Önkoşullar
- Visual Studio Code - (ve Eklenti paketler .Net Core Pack )
- .NET Core SDK 8
Proje öncesinde sisteminizde bulunması gereken uygulamalar yukarıda listelenmiştir.
Adım 1: Proje Klasörü oluştur ve mvc deseni ekle
projem klasörümüz osu
olsun. klasörü vs code uygulamasına bağladıktan sonra komut satırına(cmd) geçerek mvc deseni ekleyelim.
komut satırına
dotnet new mvc
komutu girilerek mvc deseni projeye dahil edilir.
Adım 2: Gerekli Paketleri Kur. (Bağımlılıklar - Dependencies)
projeye Entity Framework (EF) konutlarını kullanmak ve sqlite bağlantı komutlarını kullanabilmek için bağımlılıkların kurulması gereklidir. Bunun için yine komut satırına geçerek
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
Adım 3: Model oluştur
Model klasörü içerisine OgrenciModel.cs
isimli bir sınıf(Class) oluşturun.(Model Klasörü> fare Sağ tuş > new c# > class) Model içerisinde tutulmak istenilen bilgileri özellikler şeklinde belirleyin.
Model/OgrenciModel.cs
Dosyası içeriği. (Kendi Projenizi aşağıdaki kodlara göre düzenleyin.)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace osu.Models
{
public class OgrenciModel
{
public int Id { get; set; }
public string AdSoyad { get; set; }
public int Sinav1 { get; set; }
public int Sinav2 { get; set; }
}
}
Not: Özelikleri vscode eklenti kısayolu olan prop ifadesini yazarak hızlıca ekleyebilirsiniz.
Adım 4: DBContext Oluşturun ve Bağlantı Cümlesi Ekleyin
Model klasörü içerisine AppDbContext.cs
isimli yeni bir dosya oluşturarak aşağıdaki kodun yazabilirsiniz. yada vsCode uygulamanızda eklenti yüklüyse ef-dbcontext kısayolu ile context kodlarını yazdırın. Uygulamada sqlite kullanıldığı için bunu UseSqlite cümlesine çeviriyoruz.
Model/AppDbContext.cs
Dosyası içeriği. (Kendi Projenizi aşağıdaki kodlara göre düzenleyin.)
using Microsoft.EntityFrameworkCore;
namespace osu.Models
{
public class AppDbContext : DbContext
{
public AppDbContext() { }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=okul.db");
}
public DbSet<OgrenciModel> Ogrenciler { get; set; }
}
}
Adım 5: Uygulama başlangıcında veritabanı ilişkisini ayarlama
Uygulama Sqlite Veritabanını kullanacak şekilde yapılandırın. Program.cs dosyasını açın ve aşağıdaki değişiklikleri yapın.
using osu.Models; // Ekle.
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
// Context Bağlama içik eklenecek kısım
builder.Services.AddDbContext<AppDbContext>();
var app = builder.Build();
....
kodlar devam ediyor.
....
Not: Dosya başına using ifadesi ile Models klasörünün kendiliğinden eklenmesi gerekir. Aksi halde ekleyiniz. (using proje_ismi.Models;)
Adım 6: Migrations - Veritabanı için Sql Cümlesi oluşturma
Migration, veritabanı ve içerisindeki tabloları oluşturmak için sql cümlesini oluşturma işlemidir.
Migrations işlemi için model ve context oluşturulduktan sonra komut satırına aşağıdaki kod yazılır.
dotnet ef migrations add init
Migrations sonrası oluşturulan sql cümlesini veritabanına dönüştürmek için komut satırına aşağıdaki kod yazılır.
dotnet ef database update
Not: komut satırında dotnet ef komutu çalışmaz ve hata alırsanız. dotnet ef projeye dahil edilmemiş demektir. dotnet ef komutlarını çalıştırmak için komut satırına aşağıdaki kodlar yazılır.
dotnet tool install -g dotnet-ef
veya projede ef dosyalarını güncelleyebilirsiniz.
dotnet tool update -g dotnet-ef
Not: Komutlar çalışmıyorsa projedeki bin klasörünü silip tekrar deneyin.
Bu adım sonrasında veritabanı dosyası oluşmuş olmalıdır.
Adım 7: Controller - Veritabanı Bağlantısı
Hangi Controller ile veritabanı kullanılacaksa context değişkeni ile bağlantı sağlanır.
Controllers/ HomeController.cs
Dosyası içeriğinde ilgili değişikliği yapın.
private readonly ILogger<HomeController> _logger;
private readonly AppDbContext _context;
public HomeController(ILogger<HomeController> logger, AppDbContext context)
{
_context = context;
_logger = logger;
}
Adım 8: Listeleme Sayfası - Anasayfa
Projede Controller olarak HomeController kullanılacak ve Index action ı Anasayfa olacak.
Controllers/ HomeController.cs
Dosyası index action içeriği.
public IActionResult Index()
{
var ogrenciler = _context.Ogrenciler.ToList();
return View(ogrenciler);
}
Index action'ı düzenledikten sonra view klasörü içinde home klasörü altına Index.cshtml dosyasını oluşturuyoruz. (action içerindeki view() kısmı üzerine gelerek fare sağ tuşu ile add view - go to view komutları ile daha hızlı işlem yapılabilir. )
Views/ Home/ Index.cshtml
Dosyası içeriği.
@model List<OgrenciModel>
@{
ViewData["Title"] = "Öğrenci Listesi - Ana Sayfa";
}
<div class="text-center col-md-8 mx-auto">
<h1 class="display-4">Öğrenci Listesi</h1>
<a asp-action="ekle" type="button" class="btn btn-success mb-2">Yeni Öğrenci Ekle</a>
@if (Model.Count() > 0)
{
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Ad Soyad</th>
<th scope="col">Sınav 1</th>
<th scope="col">Sınav 2</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@foreach (var eleman in Model)
{
<tr>
<th scope="row">@eleman.Id</th>
<td>@eleman.AdSoyad</td>
<td>@eleman.Sinav1</td>
<td>@eleman.Sinav2</td>
<td>
<a type="button" class="btn btn-danger" asp-action="Sil" asp-route-id="@eleman.Id">Sil</a>
<a type="button" class="btn btn-primary" asp-action="Detay" asp-route-id="@eleman.Id">Göster</a>
<a type="button" class="btn btn-warning" asp-action="Duzenle" asp-route-id="@eleman.Id">Düzenle</a>
</td>
</tr>
}
</tbody>
</table>
}
else
{
<div class="alert alert-warning " role="alert">
Kayıtlı Öğrenci bulunamadı.
</div>
}
</div>
Adım 9: Ekle Sayfası
Oluşturulan veritabanına kayıt eklemek için ekle sayfası yap.
Controllers klasörü içindeki HomeController.cs (Controllers/ HomeController.cs) dosyasına ekle isimli action ekliyoruz. ( mvc-action kısayolu kullanılabilir. )
public IActionResult Ekle()
{
return View();
}
[HttpPost]
public IActionResult Ekle(OgrenciModel ogrenci)
{
if (!ModelState.IsValid)
{
return View(ogrenci);
}
_context.Ogrenciler.Add(ogrenci);
_context.SaveChanges();
return RedirectToAction("Index");
}
Ekle action'ı eklendikten sonra view klasörü altına ekle.cshtml dosyasını oluşturuyoruz. (action içerindeki view() kısmı üzerine gelerek fare sağ tuşu ile add view denilebilir.)
@{
ViewData["Title"] = "Öğrenci Ekleme Formu";
}
<div class="text-center col-md-4 mx-auto">
<h1 class="display-4">Öğrenci Ekle</h1>
<form method="post" class="mt-3">
<p> <input type="text" class="form-control" name="adsoyad" placeholder="Öğrenci Adı Soyadı"> </p>
<p> <input type="text" class="form-control" name="sinav1" placeholder="1.Sınavı Giriniz"> </p>
<p> <input type="text" class="form-control" name="sinav2" placeholder="2.Sınavı Giriniz"> </p>
<p> <button type="submit" class="btn btn-primary">Ekle</button> </p>
</form>
</div>
Adım 10: Silme işlemi
Sil komutu için ayrı bir sayfa yapmaya gerek yok. Controllers - HomeController.cs dosyasına Sil action'ı ekleyip Index'e yönlendirelim.
Controllers/ HomeController.cs
Dosyası sil action içeriği.
public IActionResult Sil(int id)
{
var ogrenci = _context.Ogrenciler.FirstOrDefault(x => x.Id == id);
_context.Ogrenciler.Remove(ogrenci);
_context.SaveChanges();
return RedirectToAction("Index");
}
Adım 11: Detay işlemi
Detay linkine tıklandığında başka sayfada tek öğrencinin bilgilerini gösteren sayfa yapalım.
Controllers/ HomeController.cs
Dosyası detay action içeriği.
public IActionResult Detay(int id)
{
var ogrenci = _context.Ogrenciler.FirstOrDefault(x => x.Id == id);
return View(ogrenci);
}
Views/ Home/ Detay.cshtml
Dosyası içeriği.
@{
ViewData["Title"] = "Öğrenci Bilgileri";
}
@model OgrenciModel
<div class="card text-center col-6 mx-auto">
<div class="card-header">
@Model.AdSoyad Öğrenci Bilgileri
</div>
<div class="card-body">
<h5 class="card-title">Adı Soyadı : @Model.AdSoyad</h5>
<div class="card-text">
<p> 1.Sınavı : @Model.Sinav1 </p>
<p> 2.Sınavı : @Model.Sinav2 </p>
</div>
<a asp-action="Index" class="btn btn-primary">AnaSayfaya Dön</a>
</div>
<div class="card-footer text-muted">
Öğrenci Bilgileri Sayfası
</div>
</div>
Adım 12: Düzenleme işlemi
Kayıttaki bilgileri güncellemek için öncelikle mevcut bilgileri forma yerleştirmek gerekir sonrasında değişiklikler ile güncelleme yapılır.
Controllers/ HomeController.cs
Dosyası duzenle action içeriği.
public IActionResult Duzenle(int id)
{
var ogrenci = _context.Ogrenciler.FirstOrDefault(x => x.Id == id);
return View(ogrenci);
}
[HttpPost]
public IActionResult Duzenle(OgrenciModel ogrenci)
{
_context.Ogrenciler.Update(ogrenci);
_context.SaveChanges();
return RedirectToAction("Index");
}
Views/ Home/ Duzenle.cshtml
Dosyası içeriği.
@{
ViewData["Title"] = "Öğrenci Güncelleme Sayfası";
}
@model OgrenciModel
<div class="text-center col-md-4 mx-auto">
<h1 class="display-4">Öğrenci Ekle</h1>
<form method="post" class="mt-3" asp-action="Duzenle">
<p>
<input type="text" class="form-control" name="AdSoyad" placeholder="Öğrenci Adı Soyadı" value="@Model.AdSoyad">
</p>
<p> <input type="text" class="form-control" name="Sinav1" placeholder="1.Sınavı Giriniz" value="@Model.Sinav1"> </p>
<p> <input type="text" class="form-control" name="Sinav2" placeholder="2.Sınavı Giriniz" value="@Model.Sinav2"> </p>
<p> <button type="submit" class="btn btn-primary">Bilgileri Güncelle</button> </p>
</form>
</div>
Adım 13: Proje Ön izleme
Projeyi derleyerek deneyelilm. komut satırına
dotnet watch
komutu vererek deneyelim.