CRUD com EF Core
📽 Veja esta vídeo-aula no Youtube
Este texto é continuação desse.
✨ Entity Framework - Cheatsheet (cola)
Entendendo o scaffolding
Foi criada uma classe com o contexto (employeesContext.cs
), que fará o acesso ao banco.
Ela contém a string de conexão, em texto aberto, no método OnConfiguring
. Há um warning incluso, já que não é boa prática ter usuário e senha fixos dentro da aplicação. Por enquanto, certifique-se que a senha utilizada não é sensível (já que ela poderá subir ao GitHub, por exemplo), e remova a linha iniciada com #warning
. Futuramente faremos uma segurança mais apurada.
Também foram criadas propriedades do tipo DbSet para cada uma das suas tabelas, fazendo referência às classes com a estrutura da tabela, que estão nos demais arquivos criados.
No método OnModelCreating
está definida toda a estrutura da tabela, baseada nos scripts DML (como CREATE TABLE
, por exemplo).
As classes com as estruturas das tabelas (como Departments.cs
) permitem verificar os tipos de dados e os relacionamentos de cada tabelas.
Agora, podemos usar os DbSets e as classes das tabelas para manipular nosso banco de dados.
Usando o DbContext
Todo comando que acesse banco deve usar o contexto criado. Para isso, envolvemos o comando no bloco using
, que garante que a conexão será aberta, e fechada quando não for mais necessária.
using (var db = new employeesContext())
{
// o objeto db agora dá acesso ao contexto employeesContext
}
Perceba que podemos renomear db
como quisermos (é comum usar context
, por exemplo). O nome da classe de contexto deve ser o nome da classe criada pelo scaffolding.
Para usar o contexto, temos que adicionar referência a ele.
using nomeDoProjeto.nomeDaPastaUsadaNoScaffolding;
Iterando todos os registros de uma tabela
Podemos, por exemplo, exibir todos os registros de uma tabela, iterando com foreach
.
// ...
using ExemploEF.db;
// ...
using (var db = new employeesContext())
{
// Para cada registro na tabela Departments
foreach (var dep in db.Departments)
{
Console.WriteLine($"O departamento {dep.DeptNo} se chama {dep.DeptName}.");
}
}
// ...
Dados cadastrados:
Saída:
C:\Users\ermog\Documents\code\DevWeb\ExemploEF>dotnet run
O departamento d009 se chama Customer Service.
O departamento d005 se chama Development.
O departamento d002 se chama Finance.
O departamento d003 se chama Human Resources.
O departamento d001 se chama Marketing.
O departamento d004 se chama Production.
O departamento d006 se chama Quality Management.
O departamento d008 se chama Research.
O departamento d007 se chama Sales.
Usando Linq
Ao fazer referência à System.Linq
, podemos usar seus métodos pra manipular os resultados. Serão criados os scripts DQL
adequados (SELECT
, WHERE
, ORDER BY
, etc.).
Você pode utilizar OrderBy
para ordenar os registros:
foreach (var dep in db.Departments.OrderBy(d => d.DeptNo))
{
Console.WriteLine($"O departamento {dep.DeptNo} se chama {dep.DeptName}.");
}
Saída:
C:\Users\ermog\Documents\code\DevWeb\ExemploEF>dotnet run
O departamento d001 se chama Marketing.
O departamento d002 se chama Finance.
O departamento d003 se chama Human Resources.
O departamento d004 se chama Production.
O departamento d005 se chama Development.
O departamento d006 se chama Quality Management.
O departamento d007 se chama Sales.
O departamento d008 se chama Research.
O departamento d009 se chama Customer Service.
Também pode usar Where
para filtrar.
foreach (var dep in db.Departments.Where(d => d.DeptName.Contains("ment")))
{
Console.WriteLine($"O departamento {dep.DeptNo} se chama {dep.DeptName}.");
}
Saída:
C:\Users\ermog\Documents\code\DevWeb\ExemploEF>dotnet run
O departamento d005 se chama Development.
O departamento d006 se chama Quality Management.
Para obter um só registro, em uma busca por chave, por exemplo, use SingleOrDefault
. Caso não encontrado, o resultado será null
.
var dep = db.Departments.SingleOrDefault(d => d.DeptNo == "d005");
if (dep != null)
{
Console.WriteLine($"O departamento {dep.DeptNo} se chama {dep.DeptName}.");
}
else
{
Console.WriteLine("Departamento não encontrado.");
}
Também podemos buscar pela chave primária usando Find
:
var dep = db.Departments.Find("d005");
if (dep != null)
{
Console.WriteLine($"O departamento {dep.DeptNo} se chama {dep.DeptName}.");
}
else
{
Console.WriteLine("Departamento não encontrado.");
}
Inserindo linhas
Crie uma instância da classe da tabela desejada, e adicione no DbSet. Quando todas as alterações desejadas estiverem feitas, use o método SaveChanges
do contexto.
var novoDepto = new Departments
{
DeptNo = "n001",
DeptName = "Almoxarifado",
};
db.Departments.Add(novoDepto);
db.SaveChanges();
Alterando uma linha
Altere os valores da linha normalmente, e chame SaveChanges
.
var dep = db.Departments.SingleOrDefault(d => d.DeptNo == "n001");
if (dep != null)
{
dep.DeptName = "Novo nome do Almoxarifado";
db.SaveChanges();
}
Excluindo uma linha
Use Remove
e chame SaveChanges
.
var dep = db.Departments.SingleOrDefault(d => d.DeptNo == "n001");
if (dep != null)
{
db.Departments.Remove(dep);
db.SaveChanges();
}