2
respostas

no relacionamento servico - contrato

No relalacionamento servico - contrato de 1 para 1.

É exibido no json somente o servicoId.

como eu faço para exibir todos os dados do contrato no json ?

contrato : [ dado1 : dado2 : ]

Isso eu não consegui fazer ?

2 respostas

Ola Jose!

Para exibir todos os dados do contrato no JSON junto com o serviço, você precisa incluir o relacionamento na consulta usando o .Include() do Entity Framework.

Exemplo simples:

var servico = _context.Servicos
    .Include(s => s.Contrato)
    .FirstOrDefault(s => s.Id == id);

Isso vai carregar o contrato junto com o serviço. Aí, quando você retornar isso na API (com o return Ok(servico);), o JSON já vai incluir os dados do contrato.

Se ainda não aparecer, veja se o relacionamento está bem mapeado na sua model:

public class Servico
{
    public int Id { get; set; }
    public Contrato Contrato { get; set; }
}

public class Contrato
{
    public int Id { get; set; }
    public int ServicoId { get; set; }
    public Servico Servico { get; set; }
}

E no OnModelCreating:

modelBuilder.Entity<Servico>()
    .HasOne(s => s.Contrato)
    .WithOne(c => c.Servico)
    .HasForeignKey<Contrato>(c => c.ServicoId);

Se isso estiver certo, vai funcionar. Abs;

Com esse cenário, pode validar esse comando : FirstOrDefault(s => s.Id == id);

Esse último id não sei de onde vem ?

public static void AddEndPointServico(this WebApplication app) { app.MapGet("/servicos", async ([FromServices] ServicoConverter converter, [FromServices] FreelandoContext contexto) => { var servico = converter.EntityListToResponseList(contexto.Servicos. Include(s => s.Contrato) .AsNoTracking().ToList()); var entries = contexto.ChangeTracker.Entries(); return Results.Ok(await Task.FromResult(servico)); }).WithTags("Servicos").WithOpenApi(); }

public class Contrato { public Contrato() { }

public Contrato(Guid id, double valor, Vigencia vigencia, Servico servico, Profissional profissional)
{
    Id           = id;
    Valor        = valor;
    Vigencia     = vigencia;
    Servico      = servico;
    Profissional = profissional;
}
public Guid Id { get; set; }
public double Valor { get; set; }
public Vigencia? Vigencia { get; set; }
public Guid ServicoId { get; set; }
public Servico Servico { get; set; }
public Guid ProfissionalId { get; set;}
public Profissional Profissional { get; set; }

}

namespace Freelando.Modelo; public class Servico { public Servico() { }

public Servico(Guid id, string? titulo, string? descricao, StatusServico status, 
               Contrato contrato, ICollection<Candidatura> candidaturas)
{
    Id           = id;
    Titulo       = titulo;
    Descricao    = descricao;
    Status       = status;
    Contrato     = contrato;
    Candidaturas = candidaturas;
}
public Guid Id { get; set; }
public string? Titulo { get; set; }
public string? Descricao { get; set; }
public StatusServico Status { get; set; }
public Contrato Contrato { get; set; }
public ICollection<Candidatura> Candidaturas { get; } = [];

}

internal class ContratoTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder entity) { entity.ToTable("TB_Contratos"); entity.Property(e => e.Id).HasColumnName("Id_Contrato"); entity.Property(e => e.ServicoId).HasColumnName("Id_Servico"); entity.Property(e => e.ProfissionalId).HasColumnName("ID_Profissional"); entity.OwnsOne(e => e.Vigencia, vigencia => { vigencia.Property(v => v.DataInicio).HasColumnName("Data_Inicio"); vigencia.Property(v => v.DataEncerramento).HasColumnName("Data_Encerramento"); });

    entity.HasOne(e => e.Servico)
          .WithOne(e => e.Contrato)
          .HasForeignKey<Contrato>(e => e.Id);

    entity.HasOne(e => e.Profissional)
          .WithMany(e => e.Contratos)
          .HasForeignKey(e =>e.ProfissionalId);
          
        

}

}

using Freelando.Modelo;

using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace Freelando.Dados.Mapeamentos; internal class ServicoTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder entity) { entity.ToTable("TB_Servicos");

    entity.Property(e => e.Id).HasColumnName("ID_Servico");
    entity.Property(e => e.Descricao).HasColumnName("DS_Projeto");
    entity
        .Property(e => e.Status)
        .HasConversion(
            fromObj => fromObj.ToString(),
            fromDb => (StatusServico)Enum.Parse(typeof(StatusServico), fromDb)
        );
    entity.HasOne(e => e.Contrato)
          .WithOne(e => e.Servico)
          .HasForeignKey<Contrato>(e => e.ServicoId);
}

}