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