Na aula Criando uma Web REST API em C# com ASP.NET Core 5, EF Core 5 e MySql vimos como criar e configurar um ambiente para a criação de uma Web API através do C# e ASP.NET Core 5. Entretanto, o framework Entity Framework Core 5 foi necessário para a criação das entidades no banco de dados através das models construídas no projeto. No exemplos apresentado, trabalhamos apenas com uma model e uma entidade. No entanto, podemos criar várias models e entidades de forma que elas se relacionem.
Sabendo disso, e usando os conceitos aprendidos, vamos trabalhar com relacionamento entre as models e entidades no banco de dados.
O contexto que iremos trabalhar é: Faculdade e Aluno. Onde, em uma Faculdade podemos ter vários Alunos relacionados à esta única Faculdade. Sendo assim, vamos aos passos:
Passo 1: Abre seu Visual Studio e inicie a construção de um novo projeto, igual apresentado na aula: Criando uma Web REST API em C# com ASP.NET Core 5, EF Core 5 e MySql.
Passo 2: Após a instalação dos pacotes, adicione também o pacote: Microsoft.AspNetCore.Mvc.NewtonsoftJson (Estável mais recente - 5.0.7)
Passo 3: Crie uma nova pasta no projeto chamada Models. Dentro da pasta crie uma classe chamada Faculdade e outra classe Chamada Aluno. Estas classes correspondem as models que serão utilizadas no nosso projeto.
public class Faculdade
{
public int FaculdadeId { get; set; }
public string Nome { get; set; }
public string Endereco { get; set; }
public string Cnpj { get; set; }
public List<Aluno> Alunos { get; set; }
}
public class Aluno
{
public int AlunoId { get; set; }
public string Nome { get; set; }
public string Endereco { get; set; }
public string Cpf { get; set; }
public string Turma { get; set; }
public string Matricula { get; set; }
public int FaculdadeId { get; set; }
public Faculdade Faculdade { get; set; }
}
Passo 4: Crie uma nova pasta no projeto chamada Data. Dentro da pasta crie uma classe chamada AppDbContext. Esta classe corresponde ao contexto do ORM usando o framework EF.
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Faculdade> Faculdades { get; set; }
public DbSet<Aluno> Alunos { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Faculdade>()
.HasData(
new Faculdade { FaculdadeId = 1, Nome = "Faculdade Cotemig", Endereco = "Rua 1", Cnpj = "010101010101" },
new Faculdade { FaculdadeId = 2, Nome = "UFMG", Endereco = "Rua 2", Cnpj = "020202020202" }
);
modelBuilder.Entity<Aluno>()
.HasData(
new Aluno { AlunoId = 1, Nome = "Joao", Endereco = "Rua 1", Turma = "Computacao", Cpf = "01010101", Matricula = "12345", FaculdadeId = 1 },
new Aluno { AlunoId = 2, Nome = "Jose", Endereco = "Rua 2", Turma = "Sistemas de Informacao", Cpf = "02020202", Matricula = "54321", FaculdadeId = 1 },
new Aluno { AlunoId = 3, Nome = "Maria", Endereco = "Rua 3", Turma = "Matematica", Cpf = "03030303", Matricula = "44444", FaculdadeId = 2 }
);
}
}
Passo 5: Precisamos agora, configurar para que nossa aplicação tenha acesso ao nosso banco de dados, que no caso será o MySQL. Para isso, abra a classe Startup e altere o método public void ConfigureServices(IServiceCollection services), para:
public void ConfigureServices(IServiceCollection services)
{
string mySqlConnection = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContextPool<AppDbContext>(options =>
options.UseMySql(mySqlConnection,
ServerVersion.AutoDetect(mySqlConnection))
);
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "APIFaculdadeAluno", Version = "v1" });
});
}
Passo 6: Além disso, altere o arquivo appsettings.json, para incluir as configurações de login e senha ao banco de dados:
{
"ConnectionStrings": {
"DefaultConnection": "server=localhost; port=3306; database=faculdadedb; user=root; password=; Persist Security Info=False"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Passo 7: Agora com nosso banco de dados configurado, precisamos executar alguns comandos para que nossa aplicação aplique as definições de models e ORM no banco de dados MySql. Para isso, acesse a opção no Visual Studio: Ferramentas -> Gerenciador de Pacotes do Nuget -> Console do Gerenciador de Pacotes, execute os comandos abaixo:
add-migration Inicial
update-database
Ao final, você deverá ter um resultado igual ao demonstrado abaixo:
PM> add-migration Inicial
Build started...
Build succeeded.
To undo this action, use Remove-Migration.
PM> update-database
Build started...
Build succeeded.
Done.
Passo 8: Feito isso, crie as Controllers para as models Faculdade e Aluno. Assim que for criada, altere as implementações, conforme mostrado abaixo:
Na controller AlunosController
// GET: api/Alunos
[HttpGet]
public async Task<ActionResult<IEnumerable<Aluno>>> GetAlunos()
{
return await _context.Alunos.Include(f => f.Faculdade).ToListAsync();
}
// GET: api/Alunos/5
[HttpGet("{id}")]
public async Task<ActionResult<Aluno>> GetAluno(int id)
{
var aluno = await _context.Alunos
.Include(f => f.Faculdade)
.FirstOrDefaultAsync(a => a.AlunoId == id);
if (aluno == null)
{
return NotFound();
}
return aluno;
}
Na controller FaculdadesController
// GET: api/Faculdades
[HttpGet]
public async Task<ActionResult<IEnumerable<Faculdade>>> GetFaculdades()
{
return await _context.Faculdades.Include(a => a.Alunos).ToListAsync();
}
// GET: api/Faculdades/5
[HttpGet("{id}")]
public async Task<ActionResult<Faculdade>> GetFaculdade(int id)
{
var faculdade = await _context.Faculdades
.Include(a => a.Alunos)
.FirstOrDefaultAsync(f => f.FaculdadeId == id);
if (faculdade == null)
{
return NotFound();
}
return faculdade;
}
Pronto! Sua API de Faculdade e Alunos está pronta para ser executada e testada! Clique no botão Play para executar sua aplicação! Teste-a com o Swagger, e através de outras aplicações clientes como o Postman.