|
|
@ -1,4 +1,5 @@
|
|
|
|
using Infrastructure.Domain;
|
|
|
|
using Infrastructure.Domain;
|
|
|
|
|
|
|
|
using Infrastructure.Events;
|
|
|
|
using Infrastructure.Extensions;
|
|
|
|
using Infrastructure.Extensions;
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
@ -23,13 +24,15 @@ namespace Infrastructure.Data
|
|
|
|
private readonly IHostEnvironment _env;
|
|
|
|
private readonly IHostEnvironment _env;
|
|
|
|
private readonly IConfiguration _cfg;
|
|
|
|
private readonly IConfiguration _cfg;
|
|
|
|
private readonly IDbConfig _dbConfig;
|
|
|
|
private readonly IDbConfig _dbConfig;
|
|
|
|
|
|
|
|
private readonly IEventPublisher _publisher;
|
|
|
|
|
|
|
|
|
|
|
|
public EfDbContext(DbContextOptions options, ILogger<EfDbContext> logger, IHostEnvironment env, IConfiguration cfg, IDbConfig dbConfig) : base(options)
|
|
|
|
public EfDbContext(DbContextOptions options, ILogger<EfDbContext> logger, IHostEnvironment env, IConfiguration cfg, IDbConfig dbConfig, IEventPublisher publisher) : base(options)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this._logger = logger;
|
|
|
|
this._logger = logger;
|
|
|
|
this._env = env;
|
|
|
|
this._env = env;
|
|
|
|
this._cfg = cfg;
|
|
|
|
this._cfg = cfg;
|
|
|
|
this._dbConfig = dbConfig;
|
|
|
|
this._dbConfig = dbConfig;
|
|
|
|
|
|
|
|
this._publisher = publisher;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
|
|
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
|
|
@ -69,8 +72,8 @@ namespace Infrastructure.Data
|
|
|
|
public override int SaveChanges()
|
|
|
|
public override int SaveChanges()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.ChangeTracker.DetectChanges();
|
|
|
|
this.ChangeTracker.DetectChanges();
|
|
|
|
var entries = this.ChangeTracker.Entries().Where(o => o.State == EntityState.Added ||
|
|
|
|
var entries = this.ChangeTracker.Entries().Where(o => o.State == EntityState.Added || o.State == EntityState.Modified || o.State == EntityState.Deleted).ToList();
|
|
|
|
o.State == EntityState.Modified || o.State == EntityState.Deleted).ToList();
|
|
|
|
var events = new List<object>();
|
|
|
|
foreach (var entry in entries)
|
|
|
|
foreach (var entry in entries)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var entity = entry.Entity as BaseEntity;
|
|
|
|
var entity = entry.Entity as BaseEntity;
|
|
|
@ -86,12 +89,28 @@ namespace Infrastructure.Data
|
|
|
|
{
|
|
|
|
{
|
|
|
|
(entity as IVersionEntity).RowVersion = Guid.NewGuid().ToString();
|
|
|
|
(entity as IVersionEntity).RowVersion = Guid.NewGuid().ToString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (entry.State == EntityState.Added)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
events.Add(Activator.CreateInstance(typeof(EntityInsertedEvent<>).MakeGenericType(entry.Entity.GetType()), entry.Entity));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (entry.State == EntityState.Modified)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
events.Add(Activator.CreateInstance(typeof(EntityUpdatedEvent<>).MakeGenericType(entry.Entity.GetType()), entry.Entity));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (entry.State == EntityState.Deleted)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
events.Add(Activator.CreateInstance(typeof(EntityDeletedEvent<>).MakeGenericType(entry.Entity.GetType()), entry.Entity));
|
|
|
|
|
|
|
|
}
|
|
|
|
this._logger.LogDebug($"{nameof(EfDbContext)}>{entity.GetType().Name}:{entry.State}");
|
|
|
|
this._logger.LogDebug($"{nameof(EfDbContext)}>{entity.GetType().Name}:{entry.State}");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
try
|
|
|
|
try
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return base.SaveChanges();
|
|
|
|
var result = base.SaveChanges();
|
|
|
|
|
|
|
|
if (events.Count > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
events.ForEach(o => this._publisher.Publish(o));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (DbUpdateException ex)
|
|
|
|
catch (DbUpdateException ex)
|
|
|
|
{
|
|
|
|
{
|
|
|
|