Entity Framework Core kullanarak SQL Server'a erişmeye hazırlanma (veritabanı öncelikli)

Sayfa güncel :
Sayfa oluşturma tarihi :

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