I\'ve created an interface to try to do a soft delete, mixing shadow properties and query filters. But it\'s not working.
public interface IDeletableEntity {
That does not work for me, .net core 3.1, so I tried the following approach which is kinda similar :
// fetch entity types by reflection then:
softDeletedEntityTypes.ForEach(entityType =>
{
modelBuilder.Entity(entityType, builder =>
{
builder.Property("IsDeleted");
builder.HasQueryFilter(GenerateQueryFilterExpression(entityType));
});
});
private static LambdaExpression GenerateQueryFilterExpression(Type entityType)
{
// the following lambda expression should be generated
// e => !EF.Property(e, "IsDeleted"));
var parameter = Expression.Parameter(entityType, "e"); // e =>
var fieldName = Expression.Constant("IsDeleted", typeof(string)); // "IsDeleted"
// EF.Property(e, "IsDeleted")
var genericMethodCall = Expression.Call(typeof(EF), "Property", new[] {typeof(bool)}, parameter, fieldName);
// !EF.Property(e, "IsDeleted"))
var not = Expression.Not(genericMethodCall);
// e => !EF.Property(e, "IsDeleted"));
var lambda = Expression.Lambda(not, parameter);
}