EntityFramework - campos não mapeados

Image

Olá pessoal, meu nome é Mauricio Junior e hoje eu vou mostrar pra você como trabalhar com Entity Framework, LINQ e retonar campos não mapeados no database. Eu vou falar mais sobre o problema e sobre a solução no decorrer do artigo. Veja as ferramentas que eu utilizei:

  • Linguagem C#
  • Ferramenta: Visual Studio ou Rider
  • Database: SQL Server
  • Framework: .NETCore e EntityFramework

Problema:

O problema que tenho é porque uso mais de uma tabela do database e preciso retornar dados misturados usando apenas uma entidade da tabela do database. Com o EntityFramework é necessário criar uma entidade diferente e depois retornar os dados.

Solução:

Para a solução do meu problema sem precisar novas entidades, basta colocar uma tag [NotMapped] em cima da propriedade.

Vou analisar o código da Model referente a entidade.

Código 1.1 - Insert

public bool Insert(ScheduleModel model)
{
    try
    {
        _db.ScheduleModelDbSet.Add(model);
        _db.SaveChanges();

        return true;
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

Usando o entity framework e para inserir valores no database basta adicionar a model e mandar salvar. As propriedades mapeadas são exatamentes os campos do database.

Código 1.2 - Model Schedule

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

namespace GiftWeb.Model
{
	[Table("Schedule", Schema = "dbo")]   
	public class ScheduleModel
	{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int IdSchedule { get; set; }

    public DateTime DateSchedule { get; set; }

    public string InitialHourSchedule { get; set; }
    
    public string EndHour { get; set; }
    
    public int UserDonorsId { get; set; }

    public string Observation { get; set; }

    public DateTime Date { get; set; }

    public int UserDonorsIdInserted { get; set; }

    [NotMapped]
    public string Name { get; set; }

    [NotMapped]
    public string Email { get; set; }

    [NotMapped]
    public string Phone { get; set; }
  }
}

Analisando todo o código, eu coloquei as últimas propriedades como [NotMapped] e que serão retornados pelo SELECT específico. Os campos Name, Email e Phone não estão no database da tabela ["Schedule"] e por isso eu coloquei na entidade não mapeada.

O código 1.3 - Retorna dados de mais de uma tabela.

public IEnumerable<ScheduleModel> GetScheduleByIdUser(int idUser)
{
    var query = (from schedule in _db.ScheduleModelDbSet
        join user in _db.DonorsUserDbSet
            on schedule.UserDonorsId equals user.UserDonorsId
            where schedule.UserDonorsId == idUser
        select new ScheduleModel
        {
            Name = user.Phone,
            Email = user.EmailDonors,
            Phone = user.Phone,
            IdSchedule = schedule.IdSchedule,
            DateSchedule = schedule.DateSchedule,
            Observation = schedule.Observation,
            InitialHourSchedule = schedule.InitialHourSchedule,
            EndHour = schedule.EndHour,
            UserDonorsId = schedule.UserDonorsId
        });

    return query.OrderBy(x=>x.Name);
}

Eu pego os dados de uma tabela de usuário e depois pego os dados da tabela schedule como colocado no código 1.3. Bastou colocar [NotMapped] para os dados serem mostrados na tela do usuário.

Bom, espero ter ajudado e qualquer coisa pode falar comigo pelo site www.mauriciojunior.

  • Mauricio Junior

    Mauricio Junior