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.

EF.Property arroja “No se pudo traducir la expresión LINQ”.

Estoy tratando de adaptar la eliminación suave a una aplicación ASP.NET Core 5.0 que utiliza EF Core.

Se hace de esta manera en el método OnModelCreating del DbContext:

builder.Entity<myentity>().Property<bool>("IsDeleted");
builder.Entity<myentity>().HasQueryFilter(m => EF.Property<bool>(m, "IsDeleted") == false);

Esto está recomendado en la documentación. Me gustaría evitar cambiar las Entidades de la Base de Datos subyacente (como MyEntity).

La excepción se lanza en código como este, que solía funcionar perfectamente:

var myEntities = _context.MyEntities.AsNoTracking();
return _mapper.Map<><myentity>>(myEntities);

Lleva a (en la segunda línea):

InvalidOperationException: No se pudo traducir la expresión LINQ 'DbSet<myentity>()
    .Where(s => EF.Property<bool>(s, __ef_filter___isDeleted_0) == False)'.

Dado que naturalmente hay muchos lugares donde se utiliza AutoMapper, también me gustaría NO cambiar el código utilizado para devolver mis DTO. Sería aceptable ajustar la configuración de AutoMapper.

Se utiliza PostgreSQL como base de datos subyacente, si eso hace alguna diferencia.

¿Cómo debo configurar mi filtro de consulta para que no se lance ninguna excepción para el código existente?

// Edit:

He simplificado mi ejemplo, el código exacto utiliza una cadena para el nombre de la propiedad:

private readonly string _isDeleted = "IsDeleted";

builder.Entity<myentity>().Property<bool>(_isDeleted);
builder.Entity<myentity>().HasQueryFilter(m => EF.Property<bool>(m, _isDeleted) == false);

Podría cambiar esa variable.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para adaptar la eliminación suave a una aplicación ASP.NET Core 5.0 que utiliza EF Core, puede configurar un filtro de consulta en el método OnModelCreating del DbContext. Esto implica agregar una propiedad bool llamada “IsDeleted” a su entidad, y establecer un filtro de consulta que filtre las entidades eliminadas verificando esta propiedad. Sin embargo, cambiar las entidades subyacentes de la base de datos puede no ser deseable.

    Para evitar cambiar su código existente, puede ajustar la configuración de AutoMapper. Específicamente, puede modificar los mapeos para ignorar las entidades eliminadas de forma predeterminada. Esto se puede hacer utilizando el método ForMember y verificando la propiedad “IsDeleted” de la entidad origen. Por ejemplo:

    CreateMap<myentity, mydto="">()
        .ForMember(dest => dest.SomeProperty, opt =>
            opt.MapFrom(src => src.IsDeleted ? null : src.SomeProperty))
        // mapeos adicionales...
    

    Esto mapeará la propiedad “SomeProperty” del DTO a null para las entidades eliminadas, de modo que se ignoren efectivamente.

    Además, si el filtro de consulta utiliza una cadena como nombre de propiedad, puede cambiar esta variable para que coincida con el nombre de la propiedad “IsDeleted”. Esto asegurará que el filtro funcione correctamente incluso si se cambia el nombre de la propiedad más adelante.</myentity,>

Comments are closed.