SQL Serverin käytön valmisteleminen Entity Framework Coren avulla (tietokanta ensin)

Sivu päivitetty :
Sivun luontipäivämäärä :

Toimintaympäristö

Visuaalinen studio
  • Visuaalinen studio 2022
.VERKKO
  • .NET 8
Entiteettikehyksen ydin
  • Entity Framework Core 8.0
SQL Server
  • SQL Server 2022

* Yllä oleva on vahvistusympäristö, mutta se voi toimia muiden versioiden kanssa.

Alun perin

Entity Framework Core on O/R-kartoittajien kirjasto. Kun käytät tietokantaa, voit käyttää tietokannan tietueita koodissa määriteltyjen mallien (luokkien) kautta käyttämättä suoraan SQL-lauseita. Tämä tarjoaa seuraavat edut:

  • Koska SQL-lauseita ei kirjoiteta suoraan, tietoturvariskit, kuten SQL-injektio, vähenevät.
  • Koska SQL-lauseet ovat merkkijonoja, vaikka tekisit virheen syntaksissa, sitä ei tarkisteta rakennusvirheiden varalta, mutta koska malli on ohjelman syntaksi, voit tarkistaa virheet rakennusaikana.

Entity Framework Core voi luoda automaattisesti koodia olemassa olevista tietokannoista yhteyden muodostamiseksi näihin malleihin ja tietokantoihin. Sitä vastoin on olemassa tapa kirjoittaa koodi manuaalisesti ja luoda sitten tietokanta automaattisesti.

Ensimmäistä kutsutaan "tietokanta-ensin" ja jälkimmäistä kutsutaan "koodi-ensin". Siellä on myös "malli ensin", joka luo koodia ja tietokantoja piirustuksista, kuten ER-kaavioista, mutta sitä ei käytetä laajalti Entity Framework Coressa.

Tässä tapauksessa käytämme "tietokanta ensin" -mallia, joka luo koodin olettaen, että tietokanta on jo olemassa.

SQL Serverin asennus

Jos haluat käyttää SQL Server tietokanta tässä vihjeessä, asenna SQL Server etukäteen. Se voidaan asentaa tietokoneeseen kehitysympäristössä tai toiseen tietokoneeseen verkon kautta. Jos pystyt muodostamaan yhteyden SQL Serveriin kehitysympäristöstäsi, olet valmis. Tässä vihjeessä SQL Server asennetaan erilliseen ympäristöön.

SQL Serverin asennusvaiheet jätetään pois, koska ne ovat tarpeettomia. Seuraavilla sivuilla on SQL Serveriin liittyviä vinkkejä, joten jos haluat tietää, miten se määritetään, tutustu siihen.

Taulukon luominen

Tällä kertaa luomme seuraavan tietokannan ja taulukon Mr./Ms..

  • Tietokannan nimi: TestDatabase
  • Taulukon nimi: Käyttäjä
  • Taulukon sarakkeet: [ID], [Nimi], [Salasana], [Ikä], [Sähköposti], [Syntymäpäivä], [UpdateDateTime]

Voit luoda sen millä tahansa tavalla, mutta jos et halua tehdä sitä, luo se suorittamalla seuraava SQL Server vastaan.

Seuraava on tietokannan luominen SQL, mutta koska tietokannan luomisen polku muuttuu versiosta riippuen jne., Voi olla luotettavampaa luoda se graafisella käyttöliittymällä tai komennolla SQL: n sijaan.

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

Taulukon luominen SQL.

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

Tallenna liite SQL.

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 Studion määritys

Oletamme, että olet jo määrittänyt myös tämän. Jos haluat tietää asennusmenettelyn jne., Yhteenveto on seuraavalla sivulla.

Luo projekti

Entity Framework Core ei ole riippuvainen mistään tietystä suoritusympäristöstä, joten sitä voidaan käyttää monissa projekteissa. Tässä artikkelissa käytämme Entity Framework Corea yksinkertaisessa konsolisovellusympäristössä.

Valitse uudessa projektissa Console App (Konsolisovellus).

Projekti on luotu. Sillä ei ole väliä, mikä projektin nimi on.

Hanki Entity Framework Core -paketti

Hanki paketti Entity Framework Coren käyttämiseen NuGetin kanssa.

Napsauta riippuvuutta hiiren kakkospainikkeella ja valitse NuGet-pakettien hallinta.

Kun välilehdeltä on valittu "Selaa", kirjoita hakukenttään EntityFrameworkCore . Tämän jälkeen sinun pitäisi nähdä Entity Framework Coreen liittyvät paketit luettelossa.

Koska käytämme SQL Server tällä kertaa, asennamme seuraavat paketit.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore Tässä esimerkissä asennamme . Asenna myös kaksi muuta.

Valitse asennuskohde ja napsauta Asenna-painiketta. Valitse versiolle uusin vakaa.

Valintaikkuna on periaatteessa OK ja voit napsauttaa OK.

Asenna myös kaksi muuta.

Mielestäni paketti näyttää tältä:

Mallin (koodin) luominen tietokantataulukon rakenteesta

Jos haluat, että malli ja muu koodi luodaan automaattisesti, rakenna ensin projekti varmistaaksesi, ettei siinä ole virheitä. Jos tapahtuu virhe, mallin luonti epäonnistuu. Jos olet jo varmistanut, ettei virheitä ole, sinun ei tarvitse luoda sitä.

Avaa Visual Studiossa Package Manager Console. Jos sinulla ei ole sellaista, voit avata sen valikosta "Työkalut", "NuGet Package Manager", "Package Manager Console".

Seuraava ikkuna tulee näkyviin, joten varmista, että oikeassa yläkulmassa oleva "Oletusprojekti" on projekti, jolle haluat luoda mallin. (Sinun on oltava varovainen, jos sinulla on useita projekteja)

Kirjoita syöttökenttään seuraava teksti: Parametrit muuttuvat ympäristön mukaan, joten muuta niitä seuraavien selitysten mukaisesti ajoissa.

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Esimerkki syötteestä

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
Parametrin kuvausParametrin esimerkki
Toimittaja varten SQL Server se Microsoft.EntityFrameworkCore.SqlServer on korjattu. Microsoft.EntityFrameworkCore.SqlServer
Yhteys Yhteysmerkkijono, jolla muodostetaan yhteys tietokantaan. Yhteysmerkkijonoja voidaan käyttää samalla tavalla kuin muita sovelluksia, joten noudata määritettävän sisällön yhteysmerkkijonojen merkintää. Voit käyttää joko Windows-todennusta tai SQL Server -todennusta. Muuten, sitä käytetään vain väliaikaisesti mallin luomiseen, joten tämän yhteysmerkkijonon sovelluksen julkaisemisen jälkeen ei tarvitse olla tietoinen turvallisuudesta. Jos salasanassasi on symboleja, varo pakenemasta. "Tietolähde = palvelimen nimi \ SQLEXPRESS; tietokanta = testitietokanta; käyttäjätunnus=Käyttäjänimi; salasana=**********"
f Vaikka ohjelma olisi jo olemassa, se korvataan väkisin. Ei <>
PäätelmätDir Kansiopolku, johon haluat tulostaa koodin. Polku suhteessa projektikansioon Mallit\Tietokanta
Asiayhteys Kontekstiluokkien nimet entiteettikehystä käytettäessä TestDatabaseDbContext
UseDatabaseNames Jos määritetty, tietokannan taulukon nimi on luokan nimi sellaisena kuin se on. Jos sitä ei ole määritetty, entiteettiluokan nimen tapausta mukautetaan sääntöjen mukaisesti. Ei <>
Tietojen merkinnät Kun saraketyyppi on määritetty, se liittää DataAnnotation-määritteen automaattisesti kuhunkin ominaisuuteen. Tämä on vähän hyödyllistä, jos haluat suorittaa syöttötarkistukset automaattisesti tietokannan tyypin mukaan. Ei <>
Namespace Nimitila, johon luotu entiteettiluokka kuuluu. Jos sitä ei ole määritetty, nimitila määritetään kansion mukaan. TestNamespace
ContextNamespace Nimitila, johon luotu konteksti kuuluu. Jos sitä ei ole määritetty, nimitila määritetään kansion mukaan. TestNamespace
NoOnConfiguring Älä upota koodiin raakoja yhteysmerkkijonoja. Ei <>
NoPluralize Varmista, että kontekstin kunkin taulukon nimen ominaisuuksien nimet eivät ole monikossa. Ei <>

Kun painat Enter suorittaaksesi sen, koodi luodaan automaattisesti: Jos virhe tapahtuu, syy näytetään, joten vastaa virheen sisällön mukaan.

User Taulukon mallikoodi on seuraava.

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; }
}

Muuten, varoitus näytetään, koska yhteysmerkkijono kirjoitetaan sellaisenaan luodun kontekstiluokan koodissa. Jos mahdollista, yhteysmerkkijono tulisi tallentaa erilliseen paikkaan ja asettaa ajon aikana, mutta tässä tapauksessa se on tarkoitettu toiminnon tarkistamiseen, joten jätän sen sellaisenaan.

Yritä noutaa ja näyttää tietueita

Nyt kun meillä on koodi tietokannan tietueiden käyttämiseen, yritetään hakea tietueet ja näyttää ne konsolissa.

Program.cs ja muuttaa sitä seuraavasti.

// 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));
}

Luo automaattisesti luotu DbContext luokka new . Se ilmoitetaan, jotta tietokantayhteydet voidaan using var tuhota automaattisesti.

dbContext Luo ominaisuuksia kunkin mallin käyttöä varten, joten tässä tapauksessa User voit käsitellä taulukon User tietueita käyttämällä ominaisuuksia. Myönnetty SQL luodaan automaattisesti sisäisesti, eikä sitä tarvitse huomata.

ToList Tässä laajennusmenetelmää käytetään kaikkien taulukon tietueiden noutamiseenUser.

foreach Loput tehdään käyttämällä ja JsonSerializer.Serialize -menetelmiä tietojen näyttämiseksi User konsolissa. Kuten User edellä mainittiin, jokainen taulukon sarake ilmoitetaan ominaisuudeksi, joten arvo on mahdollista hakea erikseen.