Entity Framework Core ile MySQL'e erişmeye hazırlanma (veritabanı öncelikli)
İş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.