Entity Framework Core kullanarak SQL Server'a erişmeye hazırlanma (veritabanı öncelikli)
Çalışma ortamı
- Görsel Stüdyo
-
- Görsel Studio 2022
- .NET
-
- .NET 8
- Entity Framework Çekirdeği
-
- Entity Framework Core 8.0
- SQL Sunucusu
-
- SQL Sunucu 2022
* Yukarıdakiler bir doğrulama ortamıdır, ancak diğer sürümlerle de çalışabilir.
İlk başta
Entity Framework Core, O/R eşleyicilerinden oluşan bir kitaplıktır. Veritabanına erişirken, doğrudan SQL deyimlerini kullanmadan, kodda tanımlanan modeller (sınıflar) aracılığıyla veritabanının kayıtlarına erişebilirsiniz. Bu, aşağıdaki avantajları sağlar:
- SQL ifadeleri doğrudan yazılmadığı için SQL enjeksiyonu gibi güvenlik riskleri azalır.
- SQL deyimleri dize olduğu için sözdiziminde bir hata yapsanız bile build hataları için kontrol edilmez ancak model bir program sözdizimi olduğu için build zamanında hataları kontrol edebilirsiniz.
Entity Framework Core, bu modellere ve veritabanlarına bağlanmak için mevcut veritabanlarından otomatik olarak kod oluşturabilir. Tersine, kodu manuel olarak yazmanın ve ardından veritabanını otomatik olarak oluşturmanın bir yolu vardır.
İlki "önce veritabanı" ve ikincisi "önce kod" olarak adlandırılır. Ayrıca, 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 durumda, veritabanının zaten var olduğu varsayımıyla kod üreten bir "veritabanı öncelikli" model kullanacağız.
SQL Server Kurulumu
Bu ipucundaki SQL Server veritabanına erişmek için lütfen SQL Server'ı önceden ayarlayın. Geliştirme ortamındaki bir PC'de veya ağ üzerinden başka bir PC'de kurulabilir. Geliştirme ortamınızdan SQL Server'a bağlanabiliyorsanız, gitmeye hazırsınız demektir. Bu ipucunda, SQL Server ayrı bir ortama yüklenir.
SQL Server kurulum adımları, yedekli oldukları için atlanır. Aşağıdaki sayfalar SQL Server ile ilgili ipuçları içerir, bu nedenle nasıl kurulacağını öğrenmek istiyorsanız lütfen buna bakın.
Tablo oluşturma
Bu sefer Mr./Mr. olarak aşağıdaki veritabanını ve tabloyu oluşturacağız.
- Veritabanı adı: TestDatabase
- Tablo adı: Kullanıcı
- Tablo sütunları: [Kimlik], [Ad], [Parola], [Yaş], [E-posta], [Doğum Günü], [UpdateDateTime]
Bunu herhangi bir şekilde oluşturabilirsiniz, ancak bunu yapmak istemiyorsanız, oluşturmak için SQL Server'da aşağıdaki SQL'i çalıştırın.
Aşağıdaki veritabanı oluşturma SQL'idir, ancak veritabanı oluşturma yolu sürüme vb. bağlı olarak değiştiğinden, SQL yerine GUI veya komut ile oluşturmak daha güvenilir olabilir.
USE [master]
GO
CREATE DATABASE [TestDatabase]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = OFF
GO
ALTER DATABASE [TestDatabase] SET COMPATIBILITY_LEVEL = 160
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestDatabase].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULLS OFF
GO
ALTER DATABASE [TestDatabase] SET ANSI_PADDING OFF
GO
ALTER DATABASE [TestDatabase] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [TestDatabase] SET ARITHABORT OFF
GO
ALTER DATABASE [TestDatabase] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [TestDatabase] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [TestDatabase] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [TestDatabase] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [TestDatabase] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [TestDatabase] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [TestDatabase] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [TestDatabase] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [TestDatabase] SET DISABLE_BROKER
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [TestDatabase] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [TestDatabase] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [TestDatabase] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [TestDatabase] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [TestDatabase] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [TestDatabase] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [TestDatabase] SET RECOVERY FULL
GO
ALTER DATABASE [TestDatabase] SET MULTI_USER
GO
ALTER DATABASE [TestDatabase] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [TestDatabase] SET DB_CHAINING OFF
GO
ALTER DATABASE [TestDatabase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [TestDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS
GO
ALTER DATABASE [TestDatabase] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [TestDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestDatabase', N'ON'
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE = ON
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = AUTO, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON)
GO
ALTER DATABASE [TestDatabase] SET READ_WRITE
GO
Tablo oluşturma SQL'i.
USE [TestDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[ID] [int] NOT NULL,
[Name] [nvarchar](20) NOT NULL,
[Password] [nvarchar](20) NOT NULL,
[Age] [int] NULL,
[Email] [nvarchar](200) NULL,
[Birthday] [date] NULL,
[UpdateDateTime] [datetime2](7) NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
Kayıt SQL'i ekleyin.
USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
Visual Studio Kurulumu
Bunu da zaten ayarladığınızı varsayıyoruz. Kurulum prosedürünü vb. öğrenmek istiyorsanız, bir sonraki sayfada özetlenmiştir.
Proje oluşturma
Entity Framework Core belirli bir yürütme ortamına bağımlı değildir, bu nedenle birçok projede kullanılabilir. Bu makalede, Entity Framework Core'u basit bir konsol uygulaması ortamında kullanacağız.
Yeni projede Konsol Uygulaması'nı seçin.
Proje oluşturuldu. Proje adının ne olduğu önemli değil.
Entity Framework Core paketini edinin
Entity Framework Core'u NuGet ile kullanmak için bir paket edinin.
Bağımlılığa sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
Sekmeden "Gözat" seçiliyken, arama alanına girin EntityFrameworkCore
. Daha sonra listede Entity Framework Core ile ilgili paketleri görmeniz gerekir.
Bu sefer SQL Server kullanacağımız için aşağıdaki paketleri kuracağız.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
Bu örnekte, kuruyoruz . Diğer ikisini de yükleyin.
Kurulum hedefini seçin ve Install (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'dır ve Tamam'a tıklayabilirsiniz.
Diğer ikisini de yükleyin.
Sanırım paket şöyle görünüyor:
Veritabanı tablo yapısından bir model (kod) oluşturma
Modelin ve diğer kodun otomatik olarak oluşturulmasını sağlamak için, önce hata olmadığından emin olmak için projeyi derleyin. Bir hata varsa, model oluşturma işlemi 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. Eğer sahip değilseniz, "Araçlar", "NuGet Paket Yöneticisi", "Paket Yöneticisi Konsolu" menüsünden açabilirsiniz.
Aşağıdaki pencere görüntülenecektir, bu nedenle sağ üst köşedeki "Varsayılan Proje" nin model 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şir, bu nedenle lütfen bunları aşağıdaki açıklamalara göre zamanında değiştirin.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Örnek Giriş
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=TestServer;Database=TestDatabase;user id=TestUser;password=pass;TrustServerCertificate=true" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Parametre | açıklamasıParametre | örneği |
---|---|---|
Sağlayıcı | SQL Server için bu Microsoft.EntityFrameworkCore.SqlServer düzeltildi. |
Microsoft.EntityFrameworkCore.SqlServer |
Bağlantı | Veritabanına bağlanmak için bağlantı dizesi. Bağlantı dizeleri diğer uygulamalarla ortak olarak kullanılabilir, bu nedenle lütfen belirtilecek içerikler için bağlantı dizelerinin gösterimini izleyin. Windows Kimlik Doğrulaması'nı veya SQL Server Kimlik Doğrulaması'nı kullanabilirsiniz. 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ınladıktan sonra güvenliğin farkında olmanıza gerek yoktur. Şifrenizde semboller varsa, kaçmaya dikkat edin. | "Veri Kaynağı=SunucuAdı\SQLEXPRESS; Database=TestDatabase; kullanıcı kimliği = KullanıcıAdı; şifre=**********" |
f | Program zaten mevcut olsa bile, zorla üzerine yazılacaktır. | Hiçbir <> |
Çıktı Dizini | Kodun çıktısını almak istediğiniz klasör yolu. Proje klasörüne göre yol | Modeller\Veritabanı |
Bağlam | Entity Framework kullanılırken bağlam sınıfı adları | TestDatabaseDbContext |
UseDatabaseNames (Veritabanı Adları Kullan) | Belirtilirse, veritabanının tablo adı olduğu gibi sınıf adı olacaktır. Belirtilmezse, varlık sınıfı adının büyük/küçük harfi kurallara göre ayarlanır. | Hiçbir <> |
Veri Ek Açıklamaları | Belirtildiğinde, sütun türü her özelliğe otomatik olarak DataAnnotation özniteliğini ekler. Veritabanı türüne göre giriş kontrollerini otomatik olarak gerçekleştirmek istiyorsanız bu biraz kullanışlıdır. | Hiçbir <> |
Ad alanı | 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 katıştırmayın. | Hiçbir <> |
HayırÇoğulculaştırma | Bağlamdaki her tablo adının özellik adlarının çoğul olmadığından emin olun. | Hiçbir <> |
Çalıştırmak için Enter tuşuna bastığınızda, kod otomatik olarak oluşturulur: Bir hata oluşursa, nedeni görüntülenecektir, bu nedenle lütfen hata içeriğine göre yanıt verin.
User
Tablonun model kodu aşağıdaki gibidir.
using System.ComponentModel.DataAnnotations;
namespace SetupSqlServerDatabaseFirst.Models.Database;
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; } = null!;
public int? Age { get; set; }
[StringLength(200)]
public string? Email { get; set; }
public DateOnly? Birthday { get; set; }
public DateTime? UpdateDateTime { 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ıdır, ancak bu durumda, işlemi kontrol etme amaçlıdır, bu yüzden olduğu gibi bırakacağım.
Kayıtları almayı ve görüntülemeyi deneyin
Artık veritabanındaki kayıtlara erişmek için gerekli koda sahip olduğumuza göre, kayıtları almayı ve konsolda görüntülemeyi deneyelim.
Program.cs
ve aşağıdaki gibi değiştirin.
// See https://aka.ms/new-console-template for more information
using SetupSqlServerDatabaseFirst.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));
}
içinde otomatik olarak oluşturulan DbContext
sınıfı new
oluşturun. Veritabanı bağlantılarının otomatik olarak yok edilebilmesi using var
için 'de bildirilir.
dbContext
Her modele erişmek için özellikler oluşturur, bu nedenle bu durumda User
, özelliklere erişerek User
tablodaki kayıtları değiştirebilirsiniz.
Verilen SQL otomatik olarak dahili olarak oluşturulur ve fark edilmesi gerekmez.
ToList
Burada, tablodaki tüm kayıtları almak için User
bir uzantı yöntemi kullanılır.
foreach
Geri kalanı, konsoldaki bilgileri görüntülemek için User
ve JsonSerializer.Serialize
yöntemleri kullanılarak yapılır.
Yukarıda belirtildiği gibiUser
, tablodaki her sütun bir özellik olarak bildirilir, bu nedenle değeri tek tek almak mümkündür.