Erkan KESER

Asp.Net Core ile Sqlite Veritabanı oluşturma ve CRUD işlemleri

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: Araba için belirlenen bazı özellikler(Marka, Model, Yıl, Yakıt) için sqlite veritabanına kayıt, listeleme, tekil gösterme, silme, güncelleme gibi işlemleri en basit haliyle yapılması anlatılacak. 

Önkoşullar 

  1. Visual Studio Code - (ve Eklenti paketler .Net Core Pack )
  2. .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 aspCrud 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.Tools
dotnet add package Microsoft.EntityFrameworkCore.Sqlite

Adım 3: Model oluştur

Model klasörü içerisine ArabaModel.cs isimli bir sınıf(Class) oluşturun. Model içerisinde tutulmak istenilen bilgileri özellikler şeklinde belirleyin.

public class ArabaModel
    {
        public int Id { get; set; }
        public string Marka { get; set; }
        public string Model { get; set; }
        public int Yil { get; set; }
        public string Yakit { 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.

public class AppDbContext: DbContext {
public AppDbContext() { }
public AppDbContext(DbContextOptions<AppDbContext> options) : base (options) { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { //optionsBuilder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Initial Catalog=DBName;Integrated Security=True"); optionsBuilder.UseSqlite("Data Source = arabalar.db"); } public DbSet<ArabaModel> arabalar { 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.

builder.Services.AddControllersWithViews();

builder.Services.AddDbContext<AppDataContext>(); // ekle

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.

Adım 8: 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.

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.)

View - Home - Ekle.cshtml dosyası

<form method="post" asp-action="Ekle">
<p> <input type="text" name="Marka" placeholder="Marka Gir"> </p>
<p> <input type="text" name="Model" placeholder="Model Gir"> </p>
<p> <input type="text" name="Yil" placeholder="Yıl Gir"> </p>
<p> <input type="text" name="Yakit" placeholder="Yakıt Gir"> </p>
<p>  <button type="submit" class="btn btn-success">Ekle</button> </p>
</form>

Controllers - HomeController.cs dosyası ekle actionları

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

    [HttpPost]
  public IActionResult Ekle(ArabaModel araba)
    {
        context.Add(araba);
        context.SaveChanges();
        return RedirectToAction("Index");
    }

Adım 9:Listeleme Sayfası

Uygulama Açıldığında HomeController - Index  kısmı çalışmaktadır. Bu Sayfaya Kaydedilen bütün bilgileri listeleyelim.  

Controllers - HomeController.cs dosyası Index actionı

public IActionResult Index()
    {
        var araba = context.arabalar.ToList();
        return View(araba);
    }

View - Home - Index.cshtml dosyası

@model List<ArabaModel>
@{
    ViewData["Title"] = "Ana Sayfa";
}

<div class="text-center">
    <h1 class="display-4">Araba Listesi</h1>
    <a asp-action="ekle"  type="button" class="btn btn-success" >Ekle</a>
    
<table class="table">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">Marka</th>
      <th scope="col">Model</th>
      <th scope="col">Yıl</th>
      <th scope="col">Yakıt</th>
      <th scope="col">İşlemler</th>
    </tr>
  </thead>
  <tbody>

@foreach(var eleman in Model ) {
     <tr>
      <th scope="row">@eleman.Id</th>
      <td>@eleman.Marka</td>
      <td>@eleman.Model</td>
      <td>@eleman.Yil</td>
      <td>@eleman.Yakit</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>

</div>

Adım 10: Sil Sayfası

Sil komutu için ayrı bir sayfa yapmaya gerek yok. Controllers - HomeController.cs dosyasına Sil action'ı ekleyip anasayfa'ya yönlendirelim.

Controllers - HomeController.cs - sil Action'ı

public IActionResult Sil(int id)
{
    var araba = context.arabalar.FirstOrDefault(x => x.Id == id);
    context.arabalar.Remove(araba);
    context.SaveChanges();
    return RedirectToAction("Index");
}

Adım 11: Detay Sayfası

detay linkine tıklandığında başka sayfada tek arabanın bilgilerini gösteren sayfa yapalım.

Controllers - HomeController.cs dosyası Detay action'ı

public IActionResult Detay(int id)
{
    var araba = context.arabalar.FirstOrDefault(x => x.Id == id);
    return View(araba);
}

View - Home - Detay.cshtml dosyası

@model ArabaModel

<div class="text-center">
    <h1>@Model.Marka Arabası Detayı</h1>
    <p> Marka : @Model.Marka </p>
    <p> Model : @Model.Model </p>
    <p> Yıl : @Model.Yil </p>
    <p> Yakıt : @Model.Yakit </p>

    <a asp-action="Index"> AnaSayfaya Dön</a>
</div>

Adım 12: Güncelle Sayfası

Seçilen aracın bilgilerini güncellemek için sayfa yapalım. 

Controllers > HomeController.cs dosyası Guncelle action'ları

public IActionResult Duzenle(int id)
{
    var araba = context.arabalar.FirstOrDefault(x => x.Id == id);
    return View(araba);
}

[HttpPost]
public IActionResult Duzenle(ArabaModel araba)
{
    context.arabalar.Update(araba);
    context.SaveChanges();
    return RedirectToAction("Index");
}

View - Home - Guncelle.cshtml dosyası

@model ArabaModel

<form method="post" asp-action="Duzenle">
    <p> <input type="text" name="Marka" placeholder="Marka Gir" value="@Model.Marka"> </p>
    <p> <input type="text" name="Model" placeholder="Model Gir" value="@Model.Model"> </p>
    <p> <input type="text" name="Yil" placeholder="Yıl Gir" value="@Model.Yil"> </p>
    <p> <input type="text" name="Yakit" placeholder="Yakıt Gir" value="@Model.Yakit"> </p>
    <p>  <button type="submit" class="btn btn-success">Güncelle</button> </p>
</form>