Skip to content

Instantly share code, notes, and snippets.

@shahabganji
Last active January 2, 2022 17:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shahabganji/65a63d1e321fde391e304e478b040464 to your computer and use it in GitHub Desktop.
Save shahabganji/65a63d1e321fde391e304e478b040464 to your computer and use it in GitHub Desktop.
Explore Shadow Properties in EF Core
public class Author
{
// omitted properties
public DateTimeOffset CreatedOn { get; set; }
public DateTimeOffset? LastUpdatedOn { get; set; }
}
private void UpdateTrackingDates()
{
var trackingDatesChangedEntries = this.ChangeTracker.Entries()
.Where(entry => entry.State == EntityState.Added
|| entry.State == EntityState.Modified
&& entry.Entity is IHaveTrackingDates
);
foreach (var entry in trackingDatesChangedEntries)
{
if (entry.State == EntityState.Modified)
this.Entry(entry).Property("LastUpdatedOn")
.CurrentValue = DateTimeOffset.UtcNow;
else if (entry.State == EntityState.Added)
this.Entry(entry).Property("CreatedOn")
.CurrentValue = DateTimeOffset.UtcNow;
}
}
public override int SaveChanges()
{
this.UpdateTrackingDates();
return base.SaveChanges();
}
public override Task<int> SaveChangesAsync(
CancellationToken cancellationToken = new CancellationToken())
{
this.UpdateTrackingDates();
return base.SaveChangesAsync(cancellationToken);
}
public interface IHaveTrackingDates { }
public class Author : ICanBeSoftDeleted , IHaveTrackingDates
{
// omitted code
}
public static void AddTrackingDatesShadowProperties(this ModelBuilder modelBuilder)
{
var trackingDatesEntities =
typeof(IHaveTrackingDates)
.Assembly.GetTypes()
.Where(
type => typeof(IHaveTrackingDates)
.IsAssignableFrom(type)
&& type.IsClass
&& !type.IsAbstract);
foreach (var entity in trackingDatesEntities)
{
modelBuilder.Entity(entity)
.Property<DateTimeOffset>("CreatedOn")
.IsRequired();
modelBuilder.Entity(entity)
.Property<DateTimeOffset?>("LastUpdatedOn")
.IsRequired(false)
.HasColumnName("LastUpdatedAt");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment