People often ask which ORM supports "Soft Delete" or "Logical Delete". Let's try to figure out what it is and whether ORM should internally support it.
"Soft Delete" is a way of removing business entities, which implies that we mark an entity as deleted instead of physically removing it from the database. This approach is often used in Line of Business applications because of its several advantages:
- It allows us to keep history for different auditing sceneries. For example, somebody removed one document in the past from our workflow system, we surely want to be able to audit removing log and data removed document contained.
- It allows to implement Recycle Bin approach in an easy way. We'd like to be able to recycle any document removed in the past.
To implement "Soft Delete" feature in a simple case, we should:
- Create
IsDeleted
persistent property of bool
type in all softly removable types. - Automatically filter all queries, i.e., automatically add
Where(entity => !entity.IsDeleted)
to each LINQ query.
In my example on DataObjects.Net, I use a single base class for all business objects, so I can add IsDeleted
field to this class:
public class BusinessObject : Entity
{
[Field]
public bool IsDeleted { get; set;}
public new void Remove()
{
IsDeleted = true;
}
}
Then, let's create DataContext
class responsible for data access:
public static class DataContext
{
public static IQueryable<T> GetAll<T>() where T : BusinessObject
{
return Query<T>.All
.Where(entity => !entity.IsDeleted);
}
}
Now we can softly remove our entities and query not removed ones. I've created a small sample illustrating model of blog-publishing service, consisting of three classes: Blog
, BlogPost
and Comment
. So I can query recent posts from my blog using such LINQ-query:
from post in DataContext.GetAll<BlogPost>()
where
post.PublishDate > DateTime.Now-TimeSpan.FromDays(7) &&
post.Blog == myBlog
select post;
This query will return all posts except softly deleted and I don't have to add appropriate check to every query in my application.
That is the simplest example of Soft (or Logical) delete implementation, we can surely take into account different aspects specific for a particular application. Generally, I am sure that "Soft Delete" shouldn't be internally implemented within an ORM framework, it's more flexible to implement it yourself.