Idam.Libs.EF is .Net Core (C#) for Entity Framework (EF) Utils.
If you like or are using this project please give it a star. Thanks!
- Soft delete (DeletedAt).
- Timestamps (CreatedAt, UpdatedAt).
Both features support DateTime and Unix Time Milliseconds format.
DateTime using Utc format
Example of Unix Time Milliseconds: currentmillis
run this command to install
Install-Package Idam.Libs.EF
or
dotnet tool install Idam.Libs.EF
-
Add
AddTimestamps()
in your context.using Idam.Libs.EF.Extensions; public class MyDbContext : DbContext { public override int SaveChanges(bool acceptAllChangesOnSuccess) { ChangeTracker.AddTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { ChangeTracker.AddTimestamps(); return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } }
-
Implement an Interface (
ITimeStamps
orITimeStampsUnix
) to your entity.using Idam.Libs.EF.Interfaces; /// Using DateTime Format public class Boo : ITimeStamps { public int Id { get; set; } public string Name { get; set; } = default!; public string? Description { get; set; } public DateTime CreatedAt { get; set; } public DateTime UpdatedAt { get; set; } } /// Using Unix Format public class Foo : ITimeStampsUnix { public int Id { get; set; } public string Name { get; set; } = default!; public string? Description { get; set; } public long CreatedAt { get; set; } public long UpdatedAt { get; set; } }
-
Add
AddTimestamps()
andAddSoftDeleteFilter()
in your context. see below.using Idam.Libs.EF.Extensions; public class MyDbContext : DbContext { public override int SaveChanges(bool acceptAllChangesOnSuccess) { ChangeTracker.AddTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { ChangeTracker.AddTimestamps(); return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.AddSoftDeleteFilter(); base.OnModelCreating(modelBuilder); } }
-
Implement an Interface (
ISoftDelete
orISoftDeleteUnix
) to your entity.using Idam.Libs.EF.Interfaces; /// Using DateTime Format public class Boo : ISoftDelete { public int Id { get; set; } public string Name { get; set; } = default!; public string? Description { get; set; } public DateTime? DeletedAt { get; set; } } /// Using Unix Format public class Foo : ISoftDeleteUnix { public int Id { get; set; } public string Name { get; set; } = default!; public string? Description { get; set; } public long? DeletedAt { get; set; } }
The SoftDelete has a restore function, so you can restore the deleted data, see below.
using Idam.Libs.EF.Extensions;
/// Your context
public class MyDbContext : DbContext
{
public DbSet<Foo> Foos => Set<Foo>();
}
/// Foo Controller
public class FooController
{
readonly MyDbContext context;
public async Task<IActionResult> RestoreAsync(Foo foo)
{
Foo restoredFoo = context.Foos.Restore(foo);
await context.SaveChangesAsync();
return Ok(restoredFoo);
}
}
Also, you can ignore the global softdelete filter by using IgnoreQueryFilters()
. See below.
public class FooController
{
public async Task<IActionResult> GetAllDeletedAsync()
{
var deletedFoos = await context.Foos
.IgnoreQueryFilters()
.Where(x => x.DeletedAt != null)
.ToListAsync();
return Ok(deletedFoos);
}
}
You can permanently delete data that has a DeletedAt value.
An Interface to implement Id as Guid instead of int.
using Idam.Libs.EF.Interfaces;
public class Foo : IGuidEntity
{
public Guid Id { get; set; }
public string Name { get; set; } = default!;
public string? Description { get; set; }
}
Migrating from 2.0.1
-
If you implements ITimeStamps and/or ISoftDelete in your entities before, update your CreatedAt and UpdatedAt to UTC datetime.
-
Update DbContext
Inside SaveChanges() and SaveChangesAsync()
/// before ChangeTracker.Entries().AddTimestamps(); /// to ChangeTracker.AddTimestamps();
Inside OnModelCreating()
/// before var entityTypes = modelBuilder.Model.GetEntityTypes(); modelBuilder.AddSoftDeleteFilter(entityTypes); /// to modelBuilder.AddSoftDeleteFilter();