es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

System.InvalidOperationException: La propiedad ‘x.y’ es de tipo ‘x’ que no es compatible con el proveedor de base de datos actual.

Utilicé validaciones de anotaciones de datos antes, ahora quiero cambiar a Fluent Validation.
Esto se debe a que ahora cambiamos el proyecto a arquitectura limpia.

Cuando envío los datos desde Postman, la solicitud genera una excepción.

System.InvalidOperationException: La propiedad ‘X.Overview’ es de tipo ‘XOverview’, que no es compatible con el proveedor de base de datos actual. Cambie el tipo CLR de la propiedad o ignore la propiedad usando el atributo ‘[NotMapped]’ o utilizando ‘EntityTypeBuilder.Ignore’ en ‘OnModelCreating’.

al utilizar validaciones de anotaciones de datos

Dominio X.cs

public class X
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public XOverview Overview { get; set; }
}

public class XOverview
{
    [Required]
    public int Id { get; set; }

    [Required]
    public string Content { get; set; }
}

en DbConext.cs

public DbSet<xoverview> XOverview { get; set; }
// se ha eliminado el resto

El código anterior funciona bien.

Ahora quiero cambiar a Fluent Validation.

al utilizar fluent validation

Dominio X.cs

public class X
{
    public XOverview Overview { get; set; }
}

public class XOverview
{
    public int Id { get; set; }
    public string Content { get; set; }
}

// Validación fluida para X

public class XConfiguration : IEntityTypeConfiguration<x>
{
    public void Configure(EntityTypeBuilder<x> builder)
    {
        builder.HasKey(i => i.Id);

        builder.Property(i => i.Overview)
            .IsRequired();
    }
}

public class XOverviewConfiguration : IEntityTypeConfiguration<xoverview>
{
    public void Configure(EntityTypeBuilder<xoverview> builder)
    {
        builder.Property(i => i.Id)
                .IsRequired();

        builder.Property(i => i.Content)
            .IsRequired();
    }
}

¿Cuál es el error que cometí al cambiar a la validación fluida?
Por favor, ayúdame a encontrar el problema.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema está con builder.Property(i => i.Overview) en la clase XConfiguration. Dado que Overview es un objeto, no podemos mapearlo directamente a una columna de la base de datos.

    Para solucionar este problema, debemos utilizar el método OwnsOne de EntityTypeBuilder en la clase XConfiguration para mapear las propiedades del objeto Overview:

    public class XConfiguration : IEntityTypeConfiguration<x>
    {
       public void Configure(EntityTypeBuilder<x> builder)
        {
            builder.HasKey(i => i.Id);
    
            builder.OwnsOne(i => i.Overview, o =>
            {
                o.Property(p => p.Id).IsRequired();
                o.Property(p => p.Content).IsRequired();
            });
        }
    }
    

    Esto mapeará las propiedades de Overview a las respectivas columnas en la base de datos.

Comments are closed.