Preparar-se para acessar o SQL Server usando o Entity Framework Core (banco de dados primeiro)
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.