Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Mapeamento 1 pra N

Boa tarde,

Estou executando alguns testes e tenho o seguinte cenário:

Um "usuário" possui um perfil "Administrador" ou "Funcionário" e está alocado a uma secretaria "Tecnologia" ou "Saúde".

Com isso, tentei fazer o mapeamento assim:

-> Referente ao Usuário

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

namespace sistema_login.Models
{
    //classe para mapear a tabela referente no banco
    [Table("Usuario")]
    public class Usuario
    {
        [Key]
        public int Id { get; set; } 
        [Required] 
        public string Nome { get; set; }
        [Required] 
        public string login { get; set; }
        [Required] 
        public string senha { get; set; }
        [ForeignKey("perfilId")] 
        public virtual Perfil perfil {get; set;}
        [ForeignKey("secretariaId")]
        public virtual Secretaria secretaria {get; set;}

    }
}

-> Referente ao Perfil:

using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace sistema_login.Models
{
    [Table("Perfil")]
    public class Perfil
    {   
        [Key]
        public int Id { get; set; }
        public string Descricao { get; set; }
    }
}

-> Referente a Secretaria:

using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace sistema_login.Models
{
    [Table("Secretaria")]
    public class Secretaria
    {
        [Key]
        public int Id {get; set;}
        public string Descricao { get; set; }
    }
}

Junto a isso, segue meu código referente ao Context:

using Microsoft.EntityFrameworkCore;

namespace sistema_login.Models
{
    //classe criada para manipular o contexto da tabela Usuario 
    public class UsuarioContext : DbContext
    {
        public UsuarioContext(DbContextOptions<UsuarioContext> options) : base(options){
        }

        public DbSet<Usuario> Usuarios {get; set;}
        public DbSet<Perfil> Perfis {get; set;}
        public DbSet<Secretaria> Secretarias { get; set; }
    }
}

Como pode perceber é algo simples. Quando eu executar o POST na API, quero inserir um novo usuário com o id do perfil e secretaria. As descrições referentes ao perfil e secretaria já vão estar inseridos no banco. Só vou criar formulário cadastral referente ao Usuário.

Mas quando executo o POST, a API me força a cadastrar junto um Perfil e uma Secretaria. E se eu executo um GET está me retornando perfil e secretaria como nulo.

Se achar necessário posso postar o código referente ao Controller.

Será que meu erro está nesse mapeamento acima?

Obrigado de qualquer maneira!!

1 resposta
solução!

Olá, Fabrício

Depois do mapeamento ter sido feito corretamente, você pode forçar o carregamento antecipado do Perfil e da Secretaria do Usuario, na consulta LinQ, usando o método Include do LINQ to Entity, como no exemplo abaixo:

using (var context = new UsuarioContext())
{
    var usuario = context.Usuario
        .Include(u => u.Perfil)
        .Include(u => u.Secretaria)
        .Where(u => u.Id == usuarioId)
        .SingleOrDefault();
}

Isso fará com que a consulta carregue não só a entidade Usuario, como suas entidades relacionadas. É o equivalente a realizar uma consulta SQL com INNER JOIN entre as tabelas, e incluindo os campos das tabelas relacionadas no SELECT da consulta.