AyCode.Core/AyCode.Database/DbContexts/AcDbContextBase.cs

104 lines
3.5 KiB
C#

using System.Runtime.CompilerServices;
using Microsoft.EntityFrameworkCore;
using AyCode.Interfaces.TimeStampInfo;
namespace AyCode.Database.DbContexts;
public abstract class AcDbContextBase : DbContext
{
public string Name { get; set; }
public Guid SessionId { get; protected set; } = Guid.NewGuid();
protected AcDbContextBase()
{
//DbInterception.Add(new UtcDateTimeDbCommandInterceptor());
}
protected AcDbContextBase(string name) : this()
{
Name = name;
}
protected AcDbContextBase(DbContextOptions<DbContext> options, string name) : base(options)
{
Name = name;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies(true);
}
public override int SaveChanges()
{
UpdateTimeStampInfoProperties();
return base.SaveChanges();
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
UpdateTimeStampInfoProperties();
return base.SaveChangesAsync(cancellationToken);
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken())
{
UpdateTimeStampInfoProperties();
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
private void UpdateTimeStampInfoProperties()
{
var entries = ChangeTracker.Entries().Where(e =>
e.Entity is not ITimeStampDisableAutoSet && (e is { State: EntityState.Added, Entity: ITimeStampCreated } || e.State is EntityState.Modified or EntityState.Added && e.Entity is ITimeStampModified));
var utcNow = DateTime.UtcNow;
foreach (var entityEntry in entries)
{
//entityEntry.DebugView.LongView
if (entityEntry.Entity is ITimeStampModified timeStampModified)
timeStampModified.Modified = utcNow;
if (entityEntry.State != EntityState.Added) continue;
if (entityEntry.Entity is ITimeStampCreated timeStampCreated)
timeStampCreated.Created = utcNow;
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//modelBuilder.ComplexType<IPAddress>();
//modelBuilder.ComplexType<PhysicalAddress>();
//modelBuilder.Conventions.Delete<PluralizingTableNameConvention>();
//modelBuilder.Conventions.Delete<OneToManyCascadeDeleteConvention>();
//modelBuilder.Conventions.Delete<ManyToManyCascadeDeleteConvention>();
//modelBuilder.Conventions.Delete<OneToOneConstraintIntroductionConvention>();
//var dateTimeConverter = new ValueConverter<DateTime, DateTime>(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
//modelBuilder.UseValueConverterForType<DateTime>(dateTimeConverter);
modelBuilder.UseDateTimeUtc();
modelBuilder.EntitiesOfType<ITimeStampCreated>((type, builder) =>
{
builder.Property<DateTime>(nameof(ITimeStampCreated.Created)).IsRequired(); //.HasDefaultValueSql("getutcdate()");
});
modelBuilder.EntitiesOfType<ITimeStampModified>((type, builder) =>
{
builder.Property<DateTime>(nameof(ITimeStampModified.Modified)).IsRequired(); //HasComputedColumnSql("getutcdate()");
});
}
public override string ToString()
{
return $"{GetType().Name}, {Name} - ({SessionId})";
}
}