Entity Framework Core ile MySQL'e erişmeye hazırlanma (veritabanı öncelikli)

Sayfa oluşturma tarihi :

İşlem onay ortamı

Görsel Stüdyo
  • Görsel Studio 2022
.NET
  • .NET 8
Entity Framework Çekirdeği
  • Entity Framework Core 8.0
MySQL (MySQL Bilişim
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

*Yukarıdakiler bir doğrulama ortamıdır, ancak diğer sürümlerde de çalışabilir.

İlk başta

Entity Framework Core, veritabanına erişirken doğrudan SQL deyimleri yazmadan kod tanımlı modeller (sınıflar) aracılığıyla veritabanı kayıtlarına erişmenizi sağlayan bir O/R eşleştiricileri kitaplığıdır. Bu, aşağıdaki avantajları sağlar:

  • SQL ifadelerini doğrudan yazmaz, SQL enjeksiyonu gibi güvenlik risklerini azaltır
  • SQL deyimleri dize olduklarından, sözdiziminde bir hata yapsalar bile, derleme hatalarını kontrol etmeye tabi değildirler, ancak model bir program sözdizimi olduğundan, derleme zamanında hatalara karşı kontrol edilebilir.

Entity Framework Core, mevcut veritabanlarından bu modellere ve veritabanlarına bağlanmak için otomatik olarak kod oluşturur, Tersine, manuel olarak kod yazmanın ve ardından otomatik olarak bir veritabanı oluşturmanın bir yolu vardır.

İlki "önce veritabanı" ve ikincisi "önce kod" olarak adlandırılır. ER diyagramları gibi şemalardan kod ve veritabanları oluşturan "model öncelikli" de vardır, ancak Entity Framework Core'da yaygın olarak kullanılmaz.

Bu kez, bir veritabanının zaten var olduğu varsayımıyla kod oluşturan "veritabanı öncelikli" bir desen kullanacağız.

MySQL Kurulumu

Bu ipucunda, MySQL veritabanınıza erişmek için MySQL'i önceden kurduğunuzdan emin olun. Geliştirme ortamınızdaki bir PC'de veya ağ üzerinden başka bir PC'de kurulabilir. Geliştirme ortamınızdan MySQL'e bağlanabiliyorsanız, hazırsınız demektir. Bu ipucunda, MySQL'i farklı bir ortama kurduk.

MySQL kurulum adımları, yedekli olacakları için atlanacaktır. Aşağıdaki sayfalarda kurulum adımları için MySQL ile ilgili ipuçları yer almaktadır.

Tablo oluşturma

Bu durumda örnek olarak aşağıdaki şemayı (veritabanını) ve tabloyu oluşturacağız.

  • Şema Adı : test_schema
  • Tablo Adı : user
  • Tablo Sütunları : [id], [ad], [şifre], [yaş], [e-posta], [doğum günü], [is_provisional_registration], [update_datetime]

Nasıl yazdığınız önemli değil, ancak sıkıcıysa, MySQL'e karşı aşağıdaki SQL'i çalıştırın ve oluşturun:

Şema oluşturma SQL'i aşağıdadır:

CREATE DATABASE `test_schema`;

Tablo oluşturma SQL'dir.

CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(20) NOT NULL,
  `password` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(200) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `is_provisional_registration` tinyint(1) NOT NULL,
  `update_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';

SQL'e bir kayıt ekleyin.

INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');

Hesabınız için izinleri ayarlama

Programladığınız hesabın MySQL şemasına erişebilmesi için bir ana bilgisayar adı ayarladığınızdan emin olun.

Ayrıca, bağlanmak istediğiniz hesaba erişim izinlerini test_schema de ayarlamanız gerekir.

Bu sefer de kayıtların alınması işlemini gerçekleştireceğiz SELECT . Bu sefer yapmayacağım, ancak eklemek veya güncellemek isterseniz INSERT UPDATE , lütfen kontrol edin ve .

Visual Studio Kurulumu

Zaten kurduğunuzu varsayarsak. Kurulum prosedürünü bilmek istiyorsanız, bir sonraki sayfada özetledik.

Proje oluşturma

Entity Framework Core belirli bir yürütme ortamına bağlı değildir, bu nedenle birçok projede kullanılabilir. Bu durumda, Entity Framework Core'u basit bir konsol uygulaması ortamında kullanacağız.

Yeni projede Konsol Uygulaması'nı seçin (hangisi .NET Framework değilse).

Projeyi oluşturdunuz. Proje adı herhangi bir şey olabilir.

MySQL için Entity Framework Core paketini edinin

NuGet ile Entity Framework Core kullanmak için bir paket alın. Paket şunları kullanır: Bu, Microsoft'tan resmi değildir, ancak yaygın olarak kullanılmaktadır.

  • Pomelo.EntityFrameworkCore.MySql

Bağımlılığa sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.

Sekmeden "Gözat" seçiliyken, arama alanına Pomelo yazın. İlgili paketlerin listesi görüntülenecektir.

Bundan aşağıdaki paketleri yükleyin:

  • Pomelo.EntityFrameworkCore.MySql

Yüklemek istediğiniz şeyi seçin ve Yükle düğmesine tıklayın. Sürüm için en son kararlı sürümü seçin.

İletişim kutusu temelde tamam ve iyi.

Paketin aşağıdaki gibi olduğunu düşünüyorum.

Ardından arama alanına yazın EntityFrameworkCore ve aşağıdakileri de yükleyin.

  • Microsoft.EntityFrameworkCore.Tools

Sürümler için, Pomelo.EntityFrameworkCore.MySql tarafından başvurulan sürümle eşleştirin Microsoft.EntityFrameworkCore . Bu sefer 8.0.2'den bahsediyoruz, o yüzden Microsoft.EntityFrameworkCore.Tools onu da 8.0.2 yapalım. Bu paket, veritabanından kod oluşturmak için kullanılır.

Sonunda, şöyle görünmelidir:

Veritabanı tablosu yapılandırmasından bir model (kod) oluşturma

Modelinizin ve diğer kodunuzun otomatik olarak oluşturulmasını sağlamak için, önce hata olmadığından emin olmak için projenizi oluşturmanız gerekir. Bir hata varsa, model başarısız olur. Hata olmadığını zaten doğruladıysanız, derlemeniz gerekmez.

Visual Studio'dan Paket Yöneticisi Konsolu'nu açın. Aksi takdirde, Araçlar, NuGet Paket Yöneticisi ve Paket Yöneticisi Konsolu menüsünden açabilirsiniz.

Aşağıdaki gibi bir pencere göreceksiniz, bu nedenle sağ üst köşedeki "Varsayılan proje"nin modeli oluşturmak istediğiniz proje olduğundan emin olun. (Birden fazla projeniz varsa dikkatli olmanız gerekir)

Giriş alanına aşağıdaki metni girin: Parametreler ortama bağlı olarak değişecektir, bu nedenle lütfen aşağıdaki açıklamalara göre bunları zamanında değiştirin.

Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Giriş Örneği

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Parametre Açıklaması Parametre Örneği
Sağlayıcı MySQL ise Pomelo.EntityFrameworkCore.MySql , şöyle belirtin. Pomelo.EntityFrameworkCore.MySql
Bağlantı Bu, veritabanına bağlanmak için bağlantı dizesidir. Bağlantı dizesi diğer uygulamalarda kullanılabilir, bu nedenle lütfen belirtilen içeriği bağlantı dizesinin gösterimine göre yazın. Bu arada, yalnızca bir model oluşturmak için geçici olarak kullanılır, bu nedenle bu bağlantı dizesi için uygulamayı yayımladıktan sonra güvenliğin farkında olmanıza gerek yoktur. Şifrenizde bir sembol varsa, kaçış konusunda dikkatli olun. "Sunucu=TestServer; Veritabanı=test_schema; kullanıcı=test-kullanıcı; password=XXXXXXXX;"
f Zaten bir programınız olsa bile üzerine yazmaya zorlayın. Hiçbir <>
OutputDir Kodun çıktısını almak için klasör yolu. Proje klasöründen göreli yol Modeller\Veritabanı
Bağlam Entity Framework kullanılırken bağlam sınıfı adları TestDatabaseDbContext
UseDatabaseNames Belirtilirse, veritabanındaki tablo adı olduğu gibi sınıf adı olacaktır. Aksi takdirde, varlık sınıfı adının durumu kurallara göre ayarlanır. Hiçbir <>
Veri Ek Açıklamaları Belirtilirse, sütun türü her özelliğe otomatik olarak DataAnnotation özniteliğini ekler. Veritabanının türüne göre otomatik olarak giriş kontrolü yapmak istiyorsanız bu biraz kullanışlıdır. Hiçbir <>
Namespace Oluşturulan varlık sınıfının ait olduğu ad alanı. Belirtilmezse, ad alanı klasöre göre belirlenir. Test Ad Alanı
ContextNamespace (Bağlam Ad Alanı) Oluşturulan Bağlamın ait olduğu ad alanı. Belirtilmezse, ad alanı klasöre göre belirlenir. Test Ad Alanı
NoOnConfiguring Kodunuza ham bağlantı dizeleri eklemekten kaçının. Hiçbir <>
HayırÇoğullaştırmak Bağlamdaki her tablo adının çoğul özellik adından kaçının. Hiçbir <>

Çalıştırmak ve kodu otomatik olarak oluşturmak için Enter tuşuna basın: Bu bir hataysa, nedeni görüntülenecektir, bu nedenle lütfen hatanın içeriğine göre yanıt verin.

user Tablonun model kodu şöyle görünür:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SetupMysqlDatabaseFirst.Models.Database;

/// <summary>
/// テストコメント
/// </summary>
public partial class user
{
  [Key]
  public int id { get; set; }

  [StringLength(20)]
  public string name { get; set; } = null!;

  [StringLength(20)]
  public string? password { get; set; }

  public int? age { get; set; }

  [StringLength(200)]
  public string? email { get; set; }

  public DateOnly? birthday { get; set; }

  public bool is_provisional_registration { get; set; }

  [Column(TypeName = "datetime")]
  public DateTime? update_datetime { get; set; }
}

Bu arada, bağlantı dizesi oluşturulan bağlam sınıfının kodunda olduğu gibi yazıldığı için uyarı görüntülenir. Mümkünse bağlantı dizesi ayrı bir yerde saklanmalı ve çalışma zamanında ayarlanmalı ancak bu sefer işlemi kontrol etme amaçlıdır, o yüzden olduğu gibi bırakacağım.

Bir kayıt alın ve görüntüleyin

Artık veritabanındaki kayıtlara erişmek için gerekli koda sahip olduğunuza göre, kayıtları almayı ve konsolda görüntülemeyi deneyelim.

Program.cs ve aşağıdaki gibi değiştirin.

using SetupMysqlDatabaseFirst.Models.Database;
using System.Text.Json;

Console.WriteLine("Hello, World!");

// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();

// データベースから User 一覧を取得する
var users = dbContext.user.ToList();

// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
  Console.WriteLine(JsonSerializer.Serialize(user));
}

ile otomatik olarak oluşturulan sınıfı new oluşturunDbContext. Veritabanı bağlantısının otomatik olarak yok edilmesine izin vermek using var için bildirilir.

dbContext her modele erişmek için özellikler oluşturmuştur, bu nedenle bu kez user özelliklere erişerek User tablodaki kayıtları değiştirebilirsiniz. Dahili olarak otomatik olarak oluşturulduğu için verilen SQL'in farkında olmanız gerekmez.

ToList Burada tablodaki tüm kayıtları almak için bir uzantı yöntemi kullanıyoruzuser.

foreach Bundan sonra, konsoldaki bilgileri görüntülemek için ve JsonSerializer.Serialize yöntemlerini kullanıyorumuser. Yukarıda belirtildiği gibiuser, tablodaki her sütun bir özellik olarak bildirilir, bu nedenle değeri tek tek almak da mümkündür.