Entity Framework Core – Database First

Entity Framework’ün sürümleri, geliştirmeye yönelik Database First bir yaklaşımı destekler. ADO.NET Entity Data Model Sihirbazını kullanarak EDMX veri tasarımı modeli uygulayabilirsiniz. Fakat Entity Framework Core ile birlikte “EDMX” veri modeli tasarımcılarını kullanmazsınız. Çünkü Entity Framework Core tamamen kod önceliklidir.

Ama, EDMX dosyası için araç desteği, var olan bir veri tabanı şemasından model için sınıf dosyalarını tersine mühendislik yapmak için komutlar kullanarak Entity Framework Core ile gerçekleştirebilirsiniz. Bu yaklaşım, mevcut bir veritabanı için Code First olarak bilinir.

Package Manager Console

Aşağıdaki örnek, Package Manager Consol üzerinden komutlarla proje üzerinde bir SQL Server veri tabanından bir model oluşturmak için önce kodun nasıl kullanılacağını gösterir.

1 – İlk olarak bir konsol projesi oluşturun.

2 – Komutları yazmak için Visual Studio üzerinde bulunan Package Manager Console’u kullanın.

3 – Entity Framework Core Sqlserver ve Tools paketlerini projeye ekleyin:

install-package microsoft.entityframeworkcore.sqlserver -version 6.0.0
install-package microsoft.entityframeworkcore.tools -version 6.0.0

Not: Direk en güncel versiyonu yüklemek istiyorsanız -version parametresini kaldırabilirsiniz. install-package microsoft.entityframeworkcore.sqlserver

4 – Veri tabanı modeli oluşturmak için Scaffold-DbContext komutunu kullanırsınız. Komutun iki gerekli parametresi bulunmaktadır. – Sql Connection bağlantı adresi, – Veri tabanı modelinize göre seçtiğiniz entity framework sağlayıcısı. Üçünce parametre zorunlu değildir. Modelin oluşturulacağı dosyayı temsil eder.

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Northwind;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

5 – Komutu çalıştırdıktan sonra, projenin içerisinde model klasöründe DbContext sınıfı için bir dosyaya ek olarak veri tabanı tablolarınıza karşılık gelecek olan Entity’leriniz yaratıldığını göreceksiniz:

İşte bu kadar artık var olan veri tabanınıza karşılık gelen entity’lerinizin olduğu bir projeniz bulunmaktadır. Şimdi entity’ler üzerinden istediğiniz veri tabanı işlemlerini projenizde kolaylıkla gerçekleştirebilirsiniz.

DbContext sınıfı, veritabanının adını ve “NortwindContext”i alacaktır, -ContextDir seçeneğini kullanarak bunu değiştirebilirsiniz.

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Northwind;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir "MyContext"

Şimdi program.cs dosyası içinde veri tabanımızın Employees tablosu üzerinde CRUD (Create – Read – Update – Delete) işlemleri yapalım.

Örnek Proje

Select();
Add();
Update();
Remove();

static void Select()
{
    NorthwindContext db = new NorthwindContext();

    var employees = db.Employees.ToList();
    foreach (var emp in employees)
    {
        Console.WriteLine($"ID: {emp.EmployeeId} Name: {emp.FirstName} Last Name: {emp.LastName}");
    }
    Console.WriteLine("*********************\n");
}
static void Add()
{
    NorthwindContext db = new NorthwindContext();

    Employee newEmployees = new Employee();
    newEmployees.FirstName = "Fatih";
    newEmployees.LastName = "Alkan";

    db.Employees.Add(newEmployees);
    db.SaveChanges();

    Select();
}
static void Update()
{
    NorthwindContext db = new NorthwindContext();

    Employee employee = db.Employees.First(x => x.LastName == "Alkan");
    employee.LastName = "ALKAN";

    db.SaveChanges();

    Select();
}
static void Remove()
{
    NorthwindContext db = new NorthwindContext();

    Employee removeEmployee = db.Employees.First(x => x.LastName == "ALKAN");

    db.Employees.Remove(removeEmployee);
    db.SaveChanges();

    Select();
}

Sonuç

ID: 1 Name: Nancy Last Name: Davolio
ID: 2 Name: Andrew Last Name: Fuller
ID: 3 Name: Janet Last Name: Leverling
ID: 4 Name: Margaret Last Name: Peacock
ID: 5 Name: Steven Last Name: Buchanan
ID: 6 Name: Michael Last Name: Suyama
ID: 7 Name: Robert Last Name: King
ID: 8 Name: Laura Last Name: Callahan
ID: 9 Name: Anne Last Name: Dodsworth
*********************

ID: 1 Name: Nancy Last Name: Davolio
ID: 2 Name: Andrew Last Name: Fuller
ID: 3 Name: Janet Last Name: Leverling
ID: 4 Name: Margaret Last Name: Peacock
ID: 5 Name: Steven Last Name: Buchanan
ID: 6 Name: Michael Last Name: Suyama
ID: 7 Name: Robert Last Name: King
ID: 8 Name: Laura Last Name: Callahan
ID: 9 Name: Anne Last Name: Dodsworth
ID: 12 Name: Fatih Last Name: Alkan
*********************

ID: 1 Name: Nancy Last Name: Davolio
ID: 2 Name: Andrew Last Name: Fuller
ID: 3 Name: Janet Last Name: Leverling
ID: 4 Name: Margaret Last Name: Peacock
ID: 5 Name: Steven Last Name: Buchanan
ID: 6 Name: Michael Last Name: Suyama
ID: 7 Name: Robert Last Name: King
ID: 8 Name: Laura Last Name: Callahan
ID: 9 Name: Anne Last Name: Dodsworth
ID: 12 Name: Fatih Last Name: ALKAN
*********************

ID: 1 Name: Nancy Last Name: Davolio
ID: 2 Name: Andrew Last Name: Fuller
ID: 3 Name: Janet Last Name: Leverling
ID: 4 Name: Margaret Last Name: Peacock
ID: 5 Name: Steven Last Name: Buchanan
ID: 6 Name: Michael Last Name: Suyama
ID: 7 Name: Robert Last Name: King
ID: 8 Name: Laura Last Name: Callahan
ID: 9 Name: Anne Last Name: Dodsworth
*********************

Model Konfigürasyonu

Ortaya çıkan model, varsayılan olarak önerilen yaklaşım olan Fluent API kavramını kullanılarak yapılandırılır. Yapılandırmalar, oluşturulan bağlamın OnModelCreating metoduna yerleştirilir. Ancak yapılandırma için Data Annotations (Veri Ek Açıklamalarını) kullanmayı tercih ederseniz, -DataAnnotations anahtarını kullanabilirsiniz:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Northwind;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -DataAnnotations

Model Güncelleme

Veritabanındaki değişiklikleri oluşturulan modelle senkronize tutmak için önerilen yaklaşım, migrations kullanmaktır, yani önce modelde değişiklikler yapmak ve ardından değişiklikleri veri tabanına yayan kod oluşturmak için araçlar kullanmaktır. Ancak, durumunuza bağlı olarak bu her zaman bir seçenek olmayabilir. Veritabanı şeması değişiklikleri yapıldıktan sonra modeli yeniden yapılandırmanız gerekirse, bunu Update-Database seçeneğini belirterek yapabilirsiniz, örneğin:

Update-Database 0

Yukarıda örnek, tüm geçişleri geri alır.

Update-Database InitialCreate
Update-Database 20180904195021_InitialCreate -Connection your_connection_string

Yukarıda örnekler, veritabanını belirli bir migration’a göre günceller. İlki migration adını, ikincisi migration kimliğini ve belirtilen bir bağlantıyı kullanır.

Migrations

Entity Framework’ün önceki sürümlerinde, model oluşturulduktan sonra, -ignorechanges seçeneği kullanılarak mevcut veritabanının şemasını etkilemeyen bir geçiş eklemek mümkündü. Bu seçenek Entity Framework Core’da mevcut değildir, bu nedenle geçici çözüm, ilk geçişi oluşturmak ve ardından, geçişi veritabanına uygulamadan önce Up yönteminin içeriğini silmek veya yorumlamaktır. Bu, eşleşen bir model ve bir veritabanı şemasıyla sonuçlanacaktır.

Kaynak: Learn Microsoft

https://learn.microsoft.com/en-us/ef/core/cli/powershell