Preparar-se para acessar o SQL Server usando o Entity Framework Core (banco de dados primeiro)

Página atualizada :
Data de criação de página :

Ambiente operacional

Visual Studio
  • Visual Studio 2022
.REDE
  • .NET 8
Núcleo do Entity Framework
  • Núcleo do Entity Framework 8.0
Servidor SQL
  • SQL Server 2022

* O acima é um ambiente de verificação, mas pode funcionar com outras versões.

Inicialmente

O Entity Framework Core é uma biblioteca de mapeadores de O/R. Ao acessar o banco de dados, você pode acessar os registros do banco de dados por meio de modelos (classes) definidos no código, sem usar instruções SQL diretamente. Isso oferece os seguintes benefícios:

  • Como as instruções SQL não são escritas diretamente, os riscos de segurança, como injeção de SQL, são reduzidos.
  • Como as instruções SQL são strings, mesmo que você cometa um erro na sintaxe, não é verificado se há erros de compilação, mas como o modelo é uma sintaxe de programa, você pode verificar se há erros no momento da compilação.

O Entity Framework Core pode gerar automaticamente código de bancos de dados existentes para se conectar a esses modelos e bancos de dados. Por outro lado, existe uma maneira de escrever o código manualmente e, em seguida, gerar automaticamente o banco de dados.

O primeiro é chamado de "banco de dados em primeiro lugar" e o último é chamado de "código em primeiro lugar". Há também o "modelo primeiro", que gera código e bancos de dados de blueprints como diagramas ER, mas não é amplamente usado no Entity Framework Core.

Nesse caso, usaremos um padrão "database-first" que gera código na suposição de que o banco de dados já existe.

Instalação do SQL Server

Para acessar o banco de dados do SQL Server nesta dica, configure o SQL Server com antecedência. Ele pode ser configurado em um PC no ambiente de desenvolvimento ou em outro PC através da rede. Se você puder se conectar ao SQL Server a partir do seu ambiente de desenvolvimento, está pronto para começar. Nesta dica, o SQL Server é instalado em um ambiente separado.

As etapas de instalação do SQL Server são omitidas porque são redundantes. As páginas a seguir contêm dicas relacionadas ao SQL Server, portanto, se você quiser saber como configurá-lo, consulte-o.

Criar uma tabela

Desta vez, criaremos o seguinte banco de dados e tabela como Sr./Sra.

  • Nome do banco de dados: TestDatabase
  • Nome da tabela: Usuário
  • Colunas da tabela: [ID], [Nome], [Senha], [Idade], [E-mail], [Aniversário], [UpdateDateTime]

Você pode criá-lo de qualquer maneira, mas se não quiser fazer isso, execute o SQL a seguir no SQL Server para gerá-lo.

O seguinte é o SQL de criação de banco de dados, mas como o caminho de criação do banco de dados muda dependendo da versão, etc., pode ser mais confiável criá-lo com GUI ou comando em vez de SQL.

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

Criação de tabela 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

Registre Append 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

Instalação do Visual Studio

Presumimos que você também já tenha configurado isso. Se você quiser saber o procedimento de configuração, etc., ele está resumido na página seguinte.

Criar um projeto

O Entity Framework Core não depende de nenhum ambiente de execução específico, portanto, pode ser usado em muitos projetos. Neste artigo, usaremos o Entity Framework Core em um ambiente de aplicativo de console simples.

No novo projeto, selecione Aplicativo de Console.

O projeto foi criado. Não importa qual seja o nome do projeto.

Obter o pacote Entity Framework Core

Obtenha um pacote para usar o Entity Framework Core com NuGet.

Clique com o botão direito do mouse na dependência e selecione Gerenciar Pacotes NuGet.

Com "Procurar" selecionado na guia, digite no EntityFrameworkCore campo de pesquisa. Em seguida, você deve ver os pacotes relacionados ao Entity Framework Core na lista.

Como usaremos o SQL Server desta vez, instalaremos os seguintes pacotes.

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

Microsoft.EntityFrameworkCore Neste exemplo, estamos instalando o . Instale os outros dois também.

Selecione o destino de instalação e clique no botão Instalar. Para a versão, selecione a versão estável mais recente.

A caixa de diálogo está basicamente OK e você pode clicar em OK.

Instale os outros dois também.

Acho que o pacote fica assim:

Criar um modelo (código) a partir de uma estrutura de tabela de banco de dados

Para que o modelo e outro código sejam gerados automaticamente, primeiro crie o projeto para garantir que não haja erros. Se houver um erro, a criação do modelo falhará. Se você já verificou que não há erros, não precisa compilá-lo.

No Visual Studio, abra o Console do Gerenciador de Pacotes. Se você não tiver um, poderá abri-lo no menu "Ferramentas", "Gerenciador de Pacotes NuGet", "Console do Gerenciador de Pacotes".

A janela a seguir será exibida, portanto, certifique-se de que o "Projeto padrão" no canto superior direito seja o projeto para o qual você deseja criar um modelo. (Você precisa ter cuidado se tiver vários projetos)

Insira o seguinte texto no campo de entrada: Os parâmetros mudam dependendo do ambiente, portanto, altere-os de acordo com as explicações a seguir em tempo hábil.

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

Exemplo de entrada

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
Descrição do parâmetroExemplo de parâmetro
Provedor Para SQL Server, é Microsoft.EntityFrameworkCore.SqlServer fixo. Microsoft.EntityFrameworkCore.SqlServer
Conexão A cadeia de conexão para se conectar ao banco de dados. As cadeias de conexão podem ser usadas em comum com outros aplicativos, portanto, siga a notação das cadeias de conexão para que o conteúdo seja especificado. Você pode usar a Autenticação do Windows ou a Autenticação do SQL Server. A propósito, ele é usado apenas temporariamente para criar um modelo, portanto, não há necessidade de estar ciente da segurança após a publicação do aplicativo para essa cadeia de conexão. Se você tiver símbolos em sua senha, tome cuidado para não escapar. "Fonte de dados=Nome_do_Servidor\SQLEXPRESS; Banco de dados = TestDatabase; id de usuário=Nome de usuário; senha=**********"
f Mesmo que o programa já exista, ele será substituído à força. Sem <>
DiretórioSaída O caminho da pasta em que você deseja gerar o código. Caminho relativo à pasta do projeto Modelos\Banco de Dados
Contexto Nomes de classe de contexto ao usar o Entity Framework TestDatabaseDbContext
UseDatabaseNames Se especificado, o nome da tabela do banco de dados será o nome da classe como está. Se não for especificado, o uso de maiúsculas e minúsculas do nome da classe de entidade será ajustado de acordo com as regras. Sem <>
Anotações de dados Quando especificado, o tipo de coluna acrescenta automaticamente o atributo DataAnnotation a cada propriedade. Isso é um pouco útil se você deseja executar automaticamente verificações de entrada de acordo com o tipo de banco de dados. Sem <>
Namespace O namespace ao qual a classe de entidade gerada pertence. Se não for especificado, o namespace será determinado de acordo com a pasta. TestNamespace
ContextNamespace O namespace ao qual o Context gerado pertence. Se não for especificado, o namespace será determinado de acordo com a pasta. TestNamespace
NoOnConfigurando Não insira cadeias de conexão brutas em seu código. Sem <>
NoPluralize Certifique-se de que os nomes de propriedade para cada nome de tabela no Context não estejam pluralizados. Sem <>

Quando você pressiona Enter para executá-lo, o código é gerado automaticamente: Se ocorrer um erro, o motivo será exibido, portanto, responda de acordo com o conteúdo do erro.

User O código do modelo da tabela é o seguinte.

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

A propósito, o aviso é exibido porque a cadeia de conexão é gravada como está no código da classe de contexto gerada. Se possível, a cadeia de conexão deve ser armazenada em um local separado e definida em tempo de execução, mas, neste caso, é com a finalidade de verificar a operação, portanto, deixarei como está.

Tente recuperar e exibir registros

Agora que temos o código para acessar os registros no banco de dados, vamos tentar recuperar os registros e exibi-los no console.

Program.cs e modifique-o da seguinte maneira.

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

Gere a classe new gerada DbContext automaticamente no . Ele é declarado para que as conexões do banco de dados possam using var ser destruídas automaticamente.

dbContext gera propriedades para acessar cada modelo, portanto, neste caso User , você pode manipular os registros na tabela User acessando as propriedades. O SQL emitido é gerado automaticamente internamente e não precisa ser observado.

ToList Aqui, um método de extensão é usado para User recuperar todos os registros na tabela.

foreach O resto é feito usando os métodos and JsonSerializer.Serialize para User exibir as informações no console. Como User mencionado acima, cada coluna na tabela é declarada como uma propriedade, portanto, é possível recuperar o valor individualmente.