Crie Uma API Completa de E-commerce com ASP.NET Core
Domine os Relacionamentos EF Core: 1:N e N:N na Prática
Imagine uma biblioteca🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!Descubra como desenvolver um sistema de biblioteca eficiente utilizando conceitos de Orientação a Objetos em C#. Mergulhe neste tutorial prático e desafiador! onde todos os livros estão misturados nas prateleiras, sem autores ou categorias. Um caos, certo? Assim funcionam bancos de dados sem relacionamentos bem definidos. Neste artigo, você vai aprender a criar
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. conexões inteligentes entre tabelas usando Entity Framework Core
🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real., garantindo organização e eficiência!
Público-alvo: Se você já se perguntou "como ligar dados de forma profissional?" ou tem medo de SQL, este guia é para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! você!
📚 Índice🔗
- O que é 1:N (Um para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! Muitos)?
- Exemplo Prático
📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. de Relacionamento 1:N
- O que é N:N (Muitos para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! Muitos)?
- Exemplo Prático
📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. de Relacionamento N:N
- Configurações no EF Core
🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.: Fluent API na Prática
- Boas Práticas
🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. para Relacionamentos Complexos
- Dica de Estrutura para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! Tabelas Intermediárias
- Consultas
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. Inteligentes com LINQ
- Desafio Prático: Sistema de Rede Social
- Conclusão
O que é 1:N (Um para Muitos)?🔗
O relacionamento 1:N indica que uma entidade pode se relacionar com múltiplas entidades do outro lado. Já do lado oposto, cada entidade se liga a apenas uma entidade principal.
- Exemplo mundo real: um cliente pode ter muitos pedidos, mas
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. cada pedido pertence a um cliente.
- Exemplo banco de dados: se temos as tabelas
Clientes
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
Pedidos
, normalmentePedidos
conteria uma referência (chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. estrangeira) para
Clientes
.
Em termos de C#, a ideia é vincular duas classes onde uma delas possui uma coleção da outra, enquanto🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! a segunda classe tem apenas um objeto que a referencia de volta.
Exemplo Prático de Relacionamento 1:N🔗
Suponha que façamos um mini-sistema de vendas. Teremos duas classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara.:
Cliente
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
Pedido
. Cada Cliente pode ter vários Pedidos, enquanto🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! cada Pedido está atrelado a apenas um Cliente.
public class Cliente
{
public int ClienteId { get; set; }
public string Nome { get; set; }
// Um cliente pode ter vários pedidos
public List<Pedido> Pedidos { get; set; } = new List<Pedido>();
}
public class Pedido
{
public int PedidoId { get; set; }
public DateTime DataPedido { get; set; }
// FK para a tabela de Cliente
public int ClienteId { get; set; }
public Cliente Cliente { get; set; }
}
1. Cliente
tem uma lista📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. de
Pedido
.
2. Pedido
tem uma chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. estrangeira
ClienteId
que indica a quem esse pedido pertence.
Por que isso é útil?
- Você consegue, por exemplo, buscar um cliente e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. carregar rapidamente todos os pedidos feitos por ele.
- Do ponto de vista do banco de dados, fica claro que esses pedidos pertencem a apenas um cliente.
O que é N:N (Muitos para Muitos)?🔗
Um relacionamento N:N significa que múltiplas entidades de um lado podem se relacionar com múltiplas entidades do outro. Em termos mais comuns, não há limitação de cada item pertencer a apenas um conjunto ou vice-versa.
- Exemplo mundo real: imagine um sistema onde
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. um aluno pode se matricular em várias disciplinas e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades., ao mesmo tempo, uma disciplina pode ter vários alunos.
- Exemplo banco de dados: para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! resolver relacionamentos N:N, geralmente criamos uma tabela intermediária (também chamada de tabela de junção ou join table), que armazena os pares de chaves
🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. das duas tabelas principais.
Exemplo Prático de Relacionamento N:N🔗
Vamos modelar, por exemplo, Alunos
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
Disciplinas
. Queremos que um aluno possa ter várias disciplinas e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. que cada disciplina possa pertencer a vários alunos.
Exemplo de Classes com Tabela Intermediária
public class Aluno
{
public int AlunoId { get; set; }
public string Nome { get; set; }
// Lista de vinculações
public List<AlunoDisciplina> AlunoDisciplinas { get; set; }
= new List<AlunoDisciplina>();
}
public class Disciplina
{
public int DisciplinaId { get; set; }
public string NomeDisciplina { get; set; }
// Lista de vinculações
public List<AlunoDisciplina> AlunoDisciplinas { get; set; }
= new List<AlunoDisciplina>();
}
public class AlunoDisciplina
{
public int AlunoId { get; set; }
public Aluno Aluno { get; set; }
public int DisciplinaId { get; set; }
public Disciplina Disciplina { get; set; }
}
No banco de dados, haveria três tabelas: Alunos
, Disciplinas
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
AlunoDisciplina
. Essa última guardaria as chaves🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. estrangeiras
AlunoId
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
DisciplinaId
.
Vantagens dessa abordagem:
- Você consegue adicionar
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. colunas extras na tabela intermediária, caso precise (por exemplo, se em um relacionamento N:N você quiser guardar a data de matrícula ou o status da participação).
- Fica claro e organizado como cada aluno está relacionado com as disciplinas, e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. vice-versa.
Configurações no EF Core: Fluent API na Prática🔗
modelBuilder.Entity<Pedido>()
.HasOne(p => p.Cliente)
.WithMany(c => c.Pedidos)
.HasForeignKey(p => p.ClienteId);
modelBuilder.Entity<AlunoDisciplina>()
.HasKey(ad => new { ad.AlunoId, ad.DisciplinaId });
modelBuilder.Entity<AlunoDisciplina>()
.HasOne(ad => ad.Aluno)
.WithMany(a => a.AlunoDisciplinas)
.HasForeignKey(ad => ad.AlunoId);
modelBuilder.Entity<AlunoDisciplina>()
.HasOne(ad => ad.Disciplina)
.WithMany(d => d.AlunoDisciplinas)
.HasForeignKey(ad => ad.DisciplinaId);
Boas Práticas para Relacionamentos Complexos🔗
1. Nomeação de Atributos📜 Atributos Customizados: Metadados que Guiam seu Código!Descubra como atributos customizados potencializam a organização do código, facilitam auditorias e testes, e garantem eficiência. Claros: use nomes que façam sentido no contexto (ex.:
ClienteId
em vez de IdClienteFK
).
2. Consistência de Tipos: garanta que o tipo de dado (int, guid, etc.) das chaves🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. estrangeiras seja compatível com o tipo de chave primária.
3. Evite Nomes Ambíguos: se estiver ligando Pedidos
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
Produtos
, a tabela intermediária poderia se chamar 🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio.
PedidoProduto
ou algo que deixe claro a função🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. do relacionamento.
Dica de Estrutura para Tabelas Intermediárias🔗
Em relacionamentos N:N, é comum que a tabela intermediária precise conter atributos📜 Atributos Customizados: Metadados que Guiam seu Código!Descubra como atributos customizados potencializam a organização do código, facilitam auditorias e testes, e garantem eficiência. extras, como data de início do relacionamento, quantidade
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio., preço negociado, etc. Por isso, é indicado representá-la com uma classe
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. própria em C#, como no exemplo de
AlunoDisciplina
.
Isso te dá liberdade para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! manipular dados específicos desse relacionamento sem poluir as tabelas principais.
Situação | Exemplo de Dado Extra | Vantagem |
---|---|---|
Aluno vs. Disciplina | Data de Matrícula | Controlar histórico do aluno |
Pedido vs. Produto | Quantidade, Preço Unitário | Guardar ocorrências específicas |
Artigo vs. Tag | Data de Associação | Histórico de classificações |
Consultas Inteligentes com LINQ🔗
Obter📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. todos os pedidos de um cliente:
var pedidos = context.Clientes
.Where(c => c.ClienteId == clienteId)
.SelectMany(c => c.Pedidos)
.ToList();
Listar alunos de uma disciplina:
var alunos = context.Disciplinas
.Where(d => d.DisciplinaId == disciplinaId)
.SelectMany(d => d.AlunoDisciplinas)
.Select(ad => ad.Aluno)
.ToList();
Desafio Prático: Sistema de Rede Social🔗
Cenário:
- Usuários podem criar
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. posts (1:N)
- Usuários podem participar de grupos (N:N)
Tarefas:
1. Crie as classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara.
Usuario
, Post
e📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos.
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
Grupo
2. Implemente o relacionamento 1:N entre Usuario e Post📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos.
3. Crie uma tabela de junção UsuarioGrupo
4. Adicione propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção.
DateTime DataEntrada
na tabela de junção
5. Escreva uma consulta🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. para listar todos os grupos de um usuário
Dica de ouro: Use Include()
para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! carregar dados relacionados!
var usuarioComGrupos = context.Usuarios
.Include(u => u.Grupos)
.ThenInclude(ug => ug.Grupo)
.FirstOrDefault(u => u.Id == usuarioId);
Reflexão: Como você implementaria a funcionalidade de "grupos privados" nessa estrutura?
Conclusão🔗
Relacionamentos 1:N e N:N são a base para conectar múltiplas entidades em qualquer aplicação real. Entender como esses relacionamentos funcionam e como modelá-los de forma organizada vai te ajudar a criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. bases de dados escaláveis e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. fáceis de manter.
- 1:N é perfeito para cenários
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. como um cliente com muitos pedidos.
- N:N é ideal onde
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. é comum ter muitos itens de cada lado se relacionando, como alunos e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. disciplinas.
Lembre-se de que cada projeto pode ter suas particularidades, mas esses princípios gerais ajudam a guiar as decisões de design. Quando estiver implementando o código, uma estrutura clara de classes e boas práticas de nomeação🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. fazem toda a diferença para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! manutenções futuras.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/