Preparar-se para acessar o MySQL com o Entity Framework Core (banco de dados primeiro)

Data de criação de página :

Ambiente de confirmação de operação

Visual Studio
  • Visual Studio 2022
.REDE
  • .NET 8
Núcleo do Entity Framework
  • Núcleo do Entity Framework 8.0
O MySQL
  • MySQL 8.4
Pomelo.EntityFrameworkCore.MySql
  • 8.0.2

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

Inicialmente

O Entity Framework Core é uma biblioteca de mapeadores de O/R que permitem acessar registros de banco de dados por meio de modelos definidos por código (classes) sem escrever instruções SQL diretamente ao acessar o banco de dados. Isso oferece os seguintes benefícios:

  • Não grava instruções SQL diretamente, reduzindo os riscos de segurança, como injeção de SQL
  • Como as instruções SQL são strings, mesmo que cometam um erro na sintaxe, elas não estão sujeitas à verificação de erros de compilação, mas como o modelo é uma sintaxe de programa, ele pode ser verificado quanto a erros no momento da compilação.

O Entity Framework Core gera automaticamente código para se conectar a esses modelos e bancos de dados de bancos de dados existentes, Por outro lado, existe uma maneira de escrever código manualmente e, em seguida, gerar automaticamente um 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 a partir de blueprints, como diagramas ER, mas não é amplamente usado no Entity Framework Core.

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

Configuração do MySQL

Nesta dica, certifique-se de configurar o MySQL com antecedência para acessar seu banco de dados MySQL. Ele pode ser configurado em um PC em seu ambiente de desenvolvimento ou em outro PC pela rede. Se você puder se conectar ao MySQL a partir do seu ambiente de desenvolvimento, você está pronto para ir. Nesta dica, instalamos o MySQL em um ambiente diferente.

As etapas de configuração do MySQL serão omitidas, pois serão redundantes. As páginas a seguir contêm dicas relacionadas ao MySQL para as etapas de configuração.

Criando uma tabela

Nesse caso, criaremos o seguinte esquema (banco de dados) e tabela como exemplo.

  • Nome do esquema : test_schema
  • Nome da tabela : usuário
  • Colunas da tabela: [id], [nome], [senha], [idade], [e-mail], [aniversário], [is_provisional_registration], [update_datetime]

Não importa como você o escreve, mas se for tedioso, execute e gere o seguinte SQL no MySQL:

Veja a seguir o SQL de criação de esquema:

CREATE DATABASE `test_schema`;

A criação da tabela é SQL.

CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(20) NOT NULL,
  `password` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(200) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `is_provisional_registration` tinyint(1) NOT NULL,
  `update_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';

Adicione um registro ao SQL.

INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');

Definir permissões para sua conta

Certifique-se de ter um nome de host configurado para que a conta que você programa possa acessar o esquema MySQL.

Você também precisa definir permissões para test_schema acessar a conta à qual deseja se conectar.

Desta vez, realizaremos SELECT o processo de recuperação dos registros. Não vou fazer isso desta vez, mas se você INSERT UPDATE quiser inserir ou atualizar, verifique e .

Instalação do Visual Studio

Supondo que você já tenha configurado também. Se você quiser saber o procedimento de configuração, nós o resumimos na página seguinte.

Criar um projeto

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

No novo projeto, selecione Aplicativo de Console (o que não for .NET Framework).

Você criou o projeto. O nome do projeto pode ser qualquer coisa.

Obter o pacote Entity Framework Core para MySQL

Obtenha um pacote para usar o Entity Framework Core com o NuGet. O pacote usa: Isso não é oficial da Microsoft, mas é amplamente utilizado.

  • Pomelo.EntityFrameworkCore.MySql

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

Com "Procurar" selecionado na guia, digite no campo Pomelo de pesquisa . A lista de pacotes relacionados será exibida.

Instale os seguintes pacotes a partir deste:

  • Pomelo.EntityFrameworkCore.MySql

Selecione o que deseja instalar e clique no botão Instalar. Selecione a versão estável mais recente para a versão.

A caixa de diálogo está basicamente OK e bem.

Acho que o pacote é o seguinte.

Em seguida, digite EntityFrameworkCore no campo de pesquisa e instale o seguinte também.

  • Microsoft.EntityFrameworkCore.Tools

Para versões, Pomelo.EntityFrameworkCore.MySql corresponda à versão referenciada Microsoft.EntityFrameworkCore por . Desta vez, estamos nos referindo a 8.0.2, então Microsoft.EntityFrameworkCore.Tools vamos torná-lo 8.0.2 também. Esse pacote é usado para gerar código do banco de dados.

No final, deve ficar assim:

Criar um modelo (código) a partir de uma configuração de tabela de banco de dados

Para que seu modelo e outro código sejam gerados automaticamente, você deve primeiro criar seu projeto para garantir que não haja erros. Se houver um erro, o modelo falhará. Se você já verificou que não há erros, não precisa compilar.

Abra o Console do Gerenciador de Pacotes do Visual Studio. Caso contrário, você pode abri-lo no menu Ferramentas, Gerenciador de Pacotes NuGet e Console do Gerenciador de Pacotes.

Você verá uma janela como a abaixo, portanto, certifique-se de que o "Projeto padrão" no canto superior direito seja o projeto para o qual deseja criar o modelo. (Você precisa ter cuidado se tiver vários projetos)

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

Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Exemplo de entrada

Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Explicação do parâmetro Exemplo de parâmetro
Provedor Se for Pomelo.EntityFrameworkCore.MySql MySQL, especifique como. Pomelo.EntityFrameworkCore.MySql
Conexão Essa é a cadeia de conexão para se conectar ao banco de dados. A cadeia de conexão pode ser usada em outros aplicativos, portanto, escreva o conteúdo especificado de acordo com a notação da cadeia de conexão. 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 um símbolo em sua senha, tenha cuidado com o escape. "Server=TestServer; Banco de dados = test_schema; usuário = usuário de teste; senha=XXXXXXXX;"
f Forçar a substituição mesmo se você já tiver um programa. Sem <>
DiretórioSaída O caminho da pasta para gerar o código. Caminho relativo da 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 no banco de dados será o nome da classe como está. Caso contrário, o uso de maiúsculas e minúsculas do nome da classe de entidade é ajustado de acordo com as regras. Sem <>
Anotações de dados Se especificado, o tipo de coluna acrescenta automaticamente o atributo DataAnnotation a cada propriedade. Isso é um pouco útil se você quiser fazer automaticamente a verificação 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 Evite inserir cadeias de conexão brutas em seu código. Sem <>
NoPluralize Evite o nome da propriedade plural de cada nome de tabela no Contexto. Sem <>

Pressione Enter para executá-lo e gerar automaticamente o código: Se for um erro, o motivo será exibido, portanto, responda de acordo com o conteúdo do erro.

user O código do modelo para a tabela tem esta aparência:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SetupMysqlDatabaseFirst.Models.Database;

/// <summary>
/// テストコメント
/// </summary>
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; }

  public int? age { get; set; }

  [StringLength(200)]
  public string? email { get; set; }

  public DateOnly? birthday { get; set; }

  public bool is_provisional_registration { get; set; }

  [Column(TypeName = "datetime")]
  public DateTime? update_datetime { 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 desta vez é com o objetivo de verificar a operação, portanto, vou deixá-la como está.

Obter um registro e visualizá-lo

Agora que você tem o código para acessar os registros no banco de dados, vamos tentar obter os registros e exibi-los no console.

Program.cs e modifique-o da seguinte maneira.

using SetupMysqlDatabaseFirst.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 DbContext classe new gerada automaticamente com . Ele é declarado para permitir que using var a conexão com o banco de dados seja destruída automaticamente.

dbContext gerou propriedades para acessar cada modelo, portanto, desta vez user você pode manipular os registros na tabela User acessando as propriedades. Você não precisa estar ciente do SQL emitido porque ele é gerado automaticamente internamente.

ToList Aqui estamos usando user um método de extensão para obter todos os registros na tabela.

foreach Depois disso, uso user os métodos and JsonSerializer.Serialize para exibir as informações no console. Como user mencionado acima, cada coluna na tabela é declarada como uma propriedade, portanto, também é possível recuperar o valor individualmente.