Entity Framework Core’de Soft Delete kullanımı

Merhaba Arkadaşlar,

Bir önceki makalede global query filteleri konusuna değinmiştik. Hatırlarsanız entity bazında global query eklemiştik ve soft delete özelliğini kullanacak her entity için bunu tanımlamak zorundaydık. Bu makalede soft delete özelliği olan tüm entity’lere otomatik olarak global query uygulanmasını anlatacağım. Ben soft delete dedim ama SaaS ürün geliştiriyorsanız tenant lar vb içinde aynı mantığı kullanabilirsiniz.

Entity Framework Core - Soft Delete

Öncelikle ISoftDeletable isminde bir interface oluşturalım

public interface ISoftDeletable
{
    DateTime? deleted_at { get; set; }
}

Daha sonra soft delete için yeni bir extension ya da mevcut ortak kullandığınız extension dosyasına aşağıda vermiş olduğum kodu yapıştırın.

public static class SoftDeleteQueryExtension
{
    public static void AddSoftDeleteQueryFilter(this IMutableEntityType entityData)
    {
        var methodToCall = typeof(SoftDeleteQueryExtension)
            .GetMethod(nameof(GetSoftDeleteFilter), BindingFlags.NonPublic | BindingFlags.Static)
            ?.MakeGenericMethod(entityData.ClrType);

        var filter = methodToCall?.Invoke(null, new object[] { });

        entityData.SetQueryFilter((LambdaExpression) filter);
        entityData.AddIndex(entityData.FindProperty(nameof(ISoftDeletable.deleted_at)));
    }

    private static LambdaExpression GetSoftDeleteFilter<TEntity>() where TEntity : class, ISoftDeletable
    {
        Expression<Func<TEntity, bool>> filter = x => !x.deleted_at.HasValue;

        return filter;
    }
}

Böylelikle AddSoftDeleteQueryFilter metodu çağrıldığında filtreleme işlemini gerçekleştiren sorgumuz ilgili entity için çağrılacak. Son olarak context’e aşağıda vermiş olduğum kodu ekleyin

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    if (typeof(ISoftDeletable).IsAssignableFrom(entityType.ClrType))
    {
        entityType.AddSoftDeleteQueryFilter();      
    }    
}

Evet gördüğünüz gibi tüm entity’leri teker teker kontrol edip soft delete özelliğine sahip olanlara global olarak query filtresi eklemiş olduk. Artık ilgili entity üzerinde bir işlem yaptığınızda query’e deleted_at IS NULL ifadesinin otomatik olarak eklendiğini göreceksiniz. Bu dersimizde bu kadar, bir sonra ki derste görüşmek üzere (: