forked from ddrilling/AsbCloudServer
fix dictionaries sync
This commit is contained in:
parent
5259a1c730
commit
0c645ed960
@ -15,7 +15,7 @@ namespace AsbCloudInfrastructure
|
|||||||
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
|
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
services.AddDbContext<AsbCloudDbContext>(options =>
|
services.AddDbContext<AsbCloudDbContext>(options =>
|
||||||
options.UseNpgsql(configuration.GetConnectionString("DefaultConnection")));
|
options.UseNpgsql(configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Scoped);
|
||||||
|
|
||||||
services.AddScoped<IAsbCloudDbContext>(provider => provider.GetService<AsbCloudDbContext>());
|
services.AddScoped<IAsbCloudDbContext>(provider => provider.GetService<AsbCloudDbContext>());
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return drillingAnalysis;
|
return drillingAnalysis;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double GetAForLinearFormula(IEnumerable<(double?, double)> rawData)
|
private static double GetAForLinearFormula(IEnumerable<(double? x, double y)> rawData)
|
||||||
{
|
{
|
||||||
var (xSum, ySum, xySum, x2Sum) = GetFormulaVariables(rawData);
|
var (xSum, ySum, xySum, x2Sum) = GetFormulaVariables(rawData);
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
private readonly DbContext context;
|
private readonly DbContext context;
|
||||||
private (DateTime refreshDate, IEnumerable<object> entities) data;
|
private (DateTime refreshDate, IEnumerable<object> entities) data;
|
||||||
private readonly List<TEntity> cached;
|
private readonly List<TEntity> cached;
|
||||||
private readonly ReaderWriterLockSlim cacheLocker = new ReaderWriterLockSlim();
|
|
||||||
|
|
||||||
internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable<object> entities) data)
|
internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable<object> entities) data)
|
||||||
{
|
{
|
||||||
@ -25,36 +24,20 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
|
|
||||||
public int Refresh()
|
public int Refresh()
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
cached.Clear();
|
||||||
try
|
var dbEntities = context.Set<TEntity>().ToList();
|
||||||
{
|
cached.AddRange(dbEntities);
|
||||||
cached.Clear();
|
data.refreshDate = DateTime.Now;
|
||||||
var dbEntities = context.Set<TEntity>().ToList();
|
return cached.Count;
|
||||||
cached.AddRange(dbEntities);
|
|
||||||
data.refreshDate = DateTime.Now;
|
|
||||||
return cached.Count;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> RefreshAsync(CancellationToken token = default)
|
public async Task<int> RefreshAsync(CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
cached.Clear();
|
||||||
try
|
var dbEntities = await context.Set<TEntity>().ToListAsync(token).ConfigureAwait(false);
|
||||||
{
|
cached.AddRange(dbEntities);
|
||||||
cached.Clear();
|
data.refreshDate = DateTime.Now;
|
||||||
var dbEntities = await context.Set<TEntity>().ToListAsync(token).ConfigureAwait(false);
|
return cached.Count;
|
||||||
cached.AddRange(dbEntities);
|
|
||||||
data.refreshDate = DateTime.Now;
|
|
||||||
return cached.Count;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CheckRefresh(RefreshMode refreshMode)
|
private bool CheckRefresh(RefreshMode refreshMode)
|
||||||
@ -106,30 +89,24 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
public TEntity FirstOrDefault(RefreshMode refreshMode = RefreshMode.IfResultEmpty)
|
public TEntity FirstOrDefault(RefreshMode refreshMode = RefreshMode.IfResultEmpty)
|
||||||
{
|
{
|
||||||
bool isUpdated = CheckRefresh(refreshMode);
|
bool isUpdated = CheckRefresh(refreshMode);
|
||||||
|
|
||||||
var result = cached.FirstOrDefault();
|
var result = cached.FirstOrDefault();
|
||||||
|
|
||||||
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
||||||
{
|
{
|
||||||
Refresh();
|
Refresh();
|
||||||
return cached.FirstOrDefault();
|
return cached.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TEntity> FirstOrDefaultAsync(RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default)
|
public async Task<TEntity> FirstOrDefaultAsync(RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
bool isUpdated = await CheckRefreshAsync(refreshMode, token);
|
bool isUpdated = await CheckRefreshAsync(refreshMode, token);
|
||||||
|
|
||||||
var result = cached.FirstOrDefault();
|
var result = cached.FirstOrDefault();
|
||||||
|
|
||||||
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
||||||
{
|
{
|
||||||
await RefreshAsync(token);
|
await RefreshAsync(token);
|
||||||
return cached.FirstOrDefault();
|
return cached.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,30 +116,24 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
public TEntity FirstOrDefault(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty)
|
public TEntity FirstOrDefault(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty)
|
||||||
{
|
{
|
||||||
bool isUpdated = CheckRefresh(refreshMode);
|
bool isUpdated = CheckRefresh(refreshMode);
|
||||||
|
|
||||||
var result = cached.FirstOrDefault(predicate);
|
var result = cached.FirstOrDefault(predicate);
|
||||||
|
|
||||||
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
||||||
{
|
{
|
||||||
Refresh();
|
Refresh();
|
||||||
return cached.FirstOrDefault(predicate);
|
return cached.FirstOrDefault(predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TEntity> FirstOrDefaultAsync(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default)
|
public async Task<TEntity> FirstOrDefaultAsync(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
bool isUpdated = await CheckRefreshAsync(refreshMode, token);
|
bool isUpdated = await CheckRefreshAsync(refreshMode, token);
|
||||||
|
|
||||||
var result = cached.FirstOrDefault(predicate);
|
var result = cached.FirstOrDefault(predicate);
|
||||||
|
|
||||||
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
if (result == default && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
||||||
{
|
{
|
||||||
await RefreshAsync(token);
|
await RefreshAsync(token);
|
||||||
return cached.FirstOrDefault(predicate);
|
return cached.FirstOrDefault(predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,329 +143,153 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
public IEnumerable<TEntity> Select(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty)
|
public IEnumerable<TEntity> Select(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty)
|
||||||
{
|
{
|
||||||
bool isUpdated = CheckRefresh(refreshMode);
|
bool isUpdated = CheckRefresh(refreshMode);
|
||||||
|
|
||||||
var result = cached.Where(predicate);
|
var result = cached.Where(predicate);
|
||||||
|
|
||||||
if (!result.Any() && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
if (!result.Any() && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
||||||
{
|
{
|
||||||
Refresh();
|
Refresh();
|
||||||
return cached.Where(predicate);
|
return cached.Where(predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TEntity>> SelectAsync(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default)
|
public async Task<IEnumerable<TEntity>> SelectAsync(Func<TEntity, bool> predicate, RefreshMode refreshMode = RefreshMode.IfResultEmpty, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
bool isUpdated = await CheckRefreshAsync(refreshMode, token);
|
bool isUpdated = await CheckRefreshAsync(refreshMode, token);
|
||||||
|
|
||||||
var result = cached.Where(predicate);
|
var result = cached.Where(predicate);
|
||||||
|
|
||||||
if (!result.Any() && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
if (!result.Any() && refreshMode == RefreshMode.IfResultEmpty && !isUpdated)
|
||||||
{
|
{
|
||||||
await RefreshAsync(token);
|
await RefreshAsync(token);
|
||||||
return cached.Where(predicate);
|
return cached.Where(predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<TEntity> Update(Func<TEntity, bool> predicate, Action<TEntity> mutation)
|
public IEnumerable<TEntity> Mutate(Func<TEntity, bool> predicate, Action<TEntity> mutation)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var dbEntities = dbSet.Where(predicate);
|
||||||
try
|
if (dbEntities.Any())
|
||||||
{
|
{
|
||||||
var dbSet = context.Set<TEntity>();
|
foreach (var dbEntity in dbEntities)
|
||||||
var dbEntities = dbSet.Where(predicate);
|
mutation(dbEntity);
|
||||||
if (dbEntities.Any())
|
context.SaveChanges();
|
||||||
{
|
|
||||||
foreach (var dbEntity in dbEntities)
|
|
||||||
mutation(dbEntity);
|
|
||||||
context.SaveChanges();
|
|
||||||
}
|
|
||||||
cached.RemoveAll(e => predicate(e));
|
|
||||||
cached.AddRange(dbEntities);
|
|
||||||
return dbEntities;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
}
|
||||||
|
cached.RemoveAll(e => predicate(e));
|
||||||
|
cached.AddRange(dbEntities);
|
||||||
|
return dbEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TEntity>> UpdateAsync(Func<TEntity, bool> predicate, Action<TEntity> mutation, CancellationToken token = default)
|
public async Task<IEnumerable<TEntity>> MutateAsync(Func<TEntity, bool> predicate, Action<TEntity> mutation, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var dbEntities = dbSet.Where(predicate);
|
||||||
try
|
if (dbEntities.Any())
|
||||||
{
|
{
|
||||||
var dbSet = context.Set<TEntity>();
|
foreach (var dbEntity in dbEntities)
|
||||||
var dbEntities = dbSet.Where(predicate);
|
mutation(dbEntity);
|
||||||
if (dbEntities.Any())
|
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
{
|
|
||||||
foreach (var dbEntity in dbEntities)
|
|
||||||
mutation(dbEntity);
|
|
||||||
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
cached.RemoveAll(e => predicate(e));
|
|
||||||
cached.AddRange(dbEntities);
|
|
||||||
return dbEntities;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
}
|
||||||
|
cached.RemoveAll(e => predicate(e));
|
||||||
|
cached.AddRange(dbEntities);
|
||||||
|
return dbEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TEntity Upsert(TEntity entity)
|
public TEntity Upsert(TEntity entity)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var updated = dbSet.Update(entity);
|
||||||
try
|
context.SaveChanges();
|
||||||
{
|
Refresh();
|
||||||
var dbSet = context.Set<TEntity>();
|
return updated.Entity;
|
||||||
Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity> entityEntry;
|
|
||||||
if (cached.Contains(entity))
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Update(entity);
|
|
||||||
cached.Remove(entity);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Add(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
context.SaveChanges();
|
|
||||||
|
|
||||||
cached.Add(entityEntry.Entity);
|
|
||||||
|
|
||||||
return entityEntry.Entity;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public async Task<TEntity> UpsertAsync(TEntity entity, CancellationToken token = default)
|
public async Task<TEntity> UpsertAsync(TEntity entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var updated = dbSet.Update(entity);
|
||||||
try
|
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
{
|
await RefreshAsync(token).ConfigureAwait(false);
|
||||||
var dbSet = context.Set<TEntity>();
|
return updated.Entity;
|
||||||
Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity> entityEntry;
|
|
||||||
|
|
||||||
if (cached.Contains(entity))
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Update(entity);
|
|
||||||
cached.Remove(entity);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Add(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
cached.Add(entityEntry.Entity);
|
|
||||||
|
|
||||||
return entityEntry.Entity;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<TEntity> Upsert(IEnumerable<TEntity> entities)
|
public IEnumerable<TEntity> Upsert(IEnumerable<TEntity> entities)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var upsertedEntries = new List<TEntity>(entities.Count());
|
||||||
try
|
foreach (var entity in entities)
|
||||||
{
|
upsertedEntries.Add(dbSet.Update(entity).Entity);
|
||||||
var dbSet = context.Set<TEntity>();
|
context.SaveChanges();
|
||||||
|
Refresh();
|
||||||
var upsertedEntries = new List<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity>>(entities.Count());
|
return upsertedEntries;
|
||||||
foreach (var entity in entities)
|
|
||||||
{
|
|
||||||
Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity> entityEntry;
|
|
||||||
if (cached.Contains(entity))
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Update(entity);
|
|
||||||
cached.Remove(entity);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Add(entity);
|
|
||||||
}
|
|
||||||
upsertedEntries.Add(entityEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
context.SaveChanges();
|
|
||||||
|
|
||||||
var upserted = upsertedEntries.Select(e => e.Entity);
|
|
||||||
|
|
||||||
cached.AddRange(upserted);
|
|
||||||
|
|
||||||
return upserted;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TEntity>> UpsertAsync(IEnumerable<TEntity> entities, CancellationToken token = default)
|
public async Task<IEnumerable<TEntity>> UpsertAsync(IEnumerable<TEntity> entities, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var upsertedEntries = new List<TEntity>(entities.Count());
|
||||||
try
|
foreach (var entity in entities)
|
||||||
{
|
upsertedEntries.Add(dbSet.Update(entity).Entity);
|
||||||
var dbSet = context.Set<TEntity>();
|
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
|
await RefreshAsync(token).ConfigureAwait(false);
|
||||||
var upsertedEntries = new List<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity>>(entities.Count());
|
return upsertedEntries;
|
||||||
foreach (var entity in entities)
|
|
||||||
{
|
|
||||||
Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<TEntity> entityEntry;
|
|
||||||
if (cached.Contains(entity))
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Update(entity);
|
|
||||||
cached.Remove(entity);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
entityEntry = dbSet.Add(entity);
|
|
||||||
}
|
|
||||||
upsertedEntries.Add(entityEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var upserted = upsertedEntries.Select(e => e.Entity);
|
|
||||||
|
|
||||||
cached.AddRange(upserted);
|
|
||||||
|
|
||||||
return upserted;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Remove(Func<TEntity, bool> predicate)
|
public void Remove(Func<TEntity, bool> predicate)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
cached.RemoveAll(e => predicate(e));
|
||||||
try
|
dbSet.RemoveRange(dbSet.Where(predicate));
|
||||||
{
|
context.SaveChanges();
|
||||||
var dbSet = context.Set<TEntity>();
|
return;
|
||||||
cached.RemoveAll(e => predicate(e));
|
|
||||||
dbSet.RemoveRange(dbSet.Where(predicate));
|
|
||||||
context.SaveChanges();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task RemoveAsync(Func<TEntity, bool> predicate, CancellationToken token = default)
|
public async Task RemoveAsync(Func<TEntity, bool> predicate, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
cached.RemoveAll(e => predicate(e));
|
||||||
try
|
dbSet.RemoveRange(dbSet.Where(predicate));
|
||||||
{
|
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
var dbSet = context.Set<TEntity>();
|
return;
|
||||||
cached.RemoveAll(e => predicate(e));
|
|
||||||
dbSet.RemoveRange(dbSet.Where(predicate));
|
|
||||||
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TEntity Insert(TEntity entity)
|
public TEntity Insert(TEntity entity)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var dbEntity = dbSet.Add(entity).Entity;
|
||||||
try
|
context.SaveChanges();
|
||||||
{
|
cached.Add(dbEntity);
|
||||||
var dbSet = context.Set<TEntity>();
|
return dbEntity;
|
||||||
var dbEntity = dbSet.Add(entity).Entity;
|
|
||||||
context.SaveChanges();
|
|
||||||
cached.Add(dbEntity);
|
|
||||||
return dbEntity;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TEntity> InsertAsync(TEntity entity, CancellationToken token = default)
|
public async Task<TEntity> InsertAsync(TEntity entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var dbEntity = dbSet.Add(entity).Entity;
|
||||||
try
|
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
{
|
cached.Add(dbEntity);
|
||||||
var dbSet = context.Set<TEntity>();
|
return dbEntity;
|
||||||
var dbEntity = dbSet.Add(entity).Entity;
|
|
||||||
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
|
||||||
cached.Add(dbEntity);
|
|
||||||
return dbEntity;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<TEntity> Insert(IEnumerable<TEntity> newEntities)
|
public IEnumerable<TEntity> Insert(IEnumerable<TEntity> newEntities)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var dbEntities = new List<TEntity>(newEntities.Count());
|
||||||
try
|
foreach (var item in newEntities)
|
||||||
{
|
dbEntities.Add(dbSet.Add(item).Entity);
|
||||||
var dbSet = context.Set<TEntity>();
|
context.SaveChanges();
|
||||||
var dbEntities = new List<TEntity>(newEntities.Count());
|
cached.AddRange(dbEntities);
|
||||||
foreach (var item in newEntities)
|
return dbEntities;
|
||||||
dbEntities.Add(dbSet.Add(item).Entity);
|
|
||||||
context.SaveChanges();
|
|
||||||
cached.AddRange(dbEntities);
|
|
||||||
return dbEntities;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TEntity>> InsertAsync(IEnumerable<TEntity> newEntities, CancellationToken token = default)
|
public async Task<IEnumerable<TEntity>> InsertAsync(IEnumerable<TEntity> newEntities, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
cacheLocker.EnterWriteLock();
|
var dbSet = context.Set<TEntity>();
|
||||||
|
var dbEntities = new List<TEntity>(newEntities.Count());
|
||||||
try
|
foreach (var item in newEntities)
|
||||||
{
|
dbEntities.Add(dbSet.Add(item).Entity);
|
||||||
var dbSet = context.Set<TEntity>();
|
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
var dbEntities = new List<TEntity>(newEntities.Count());
|
cached.AddRange(dbEntities);
|
||||||
foreach (var item in newEntities)
|
return dbEntities;
|
||||||
dbEntities.Add(dbSet.Add(item).Entity);
|
|
||||||
await context.SaveChangesAsync(token).ConfigureAwait(false);
|
|
||||||
cached.AddRange(dbEntities);
|
|
||||||
return dbEntities;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
cacheLocker.ExitWriteLock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,13 +9,11 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
{
|
{
|
||||||
public class EventService : IEventService
|
public class EventService : IEventService
|
||||||
{
|
{
|
||||||
private readonly IAsbCloudDbContext db;
|
|
||||||
private readonly ITelemetryService telemetryService;
|
private readonly ITelemetryService telemetryService;
|
||||||
private readonly CacheTable<Event> cacheEvents;
|
private readonly CacheTable<Event> cacheEvents;
|
||||||
|
|
||||||
public EventService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService)
|
public EventService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService)
|
||||||
{
|
{
|
||||||
this.db = db;
|
|
||||||
this.telemetryService = telemetryService;
|
this.telemetryService = telemetryService;
|
||||||
cacheEvents = cacheDb.GetCachedTable<Event>((AsbCloudDbContext)db);
|
cacheEvents = cacheDb.GetCachedTable<Event>((AsbCloudDbContext)db);
|
||||||
}
|
}
|
||||||
@ -27,30 +25,14 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
|
|
||||||
var telemetryId = telemetryService.GetOrCreateTemetryIdByUid(uid);
|
var telemetryId = telemetryService.GetOrCreateTemetryIdByUid(uid);
|
||||||
|
|
||||||
var ids = dtos.Select(e => e.Id).ToList();
|
var entities = dtos.Select(dto => new Event
|
||||||
|
|
||||||
var dbIds = (from e in db.Events
|
|
||||||
where e.IdTelemetry == telemetryId && ids.Contains(e.IdEvent)
|
|
||||||
select e.IdEvent).ToList();
|
|
||||||
|
|
||||||
foreach (var dto in dtos)
|
|
||||||
{
|
{
|
||||||
var entity = new Event
|
IdEvent = dto.Id,
|
||||||
{
|
IdTelemetry = telemetryId,
|
||||||
IdEvent = dto.Id,
|
IdCategory = dto.IdCategory,
|
||||||
IdTelemetry = telemetryId,
|
MessageTemplate = dto.Message
|
||||||
IdCategory = dto.IdCategory,
|
});
|
||||||
MessageTemplate = dto.Message
|
cacheEvents.Upsert(entities);
|
||||||
};
|
|
||||||
|
|
||||||
if (dbIds.Contains(dto.Id))
|
|
||||||
db.Events.Update(entity);
|
|
||||||
else
|
|
||||||
db.Events.Add(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
db.SaveChanges();
|
|
||||||
cacheEvents.Refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,15 +10,13 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
{
|
{
|
||||||
public class TelemetryUserService : ITelemetryUserService
|
public class TelemetryUserService : ITelemetryUserService
|
||||||
{
|
{
|
||||||
private readonly IAsbCloudDbContext db;
|
|
||||||
private readonly ITelemetryService telemetryService;
|
private readonly ITelemetryService telemetryService;
|
||||||
private readonly CacheTable<TelemetryUser> cacheTUsers;
|
private readonly CacheTable<TelemetryUser> cacheTelemetryUsers;
|
||||||
|
|
||||||
public TelemetryUserService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService)
|
public TelemetryUserService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService)
|
||||||
{
|
{
|
||||||
this.db = db;
|
|
||||||
this.telemetryService = telemetryService;
|
this.telemetryService = telemetryService;
|
||||||
cacheTUsers = cacheDb.GetCachedTable<TelemetryUser>((AsbCloudDbContext)db);
|
cacheTelemetryUsers = cacheDb.GetCachedTable<TelemetryUser>((AsbCloudDbContext)db);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Upsert(string uid, IEnumerable<TelemetryUserDto> dtos)
|
public void Upsert(string uid, IEnumerable<TelemetryUserDto> dtos)
|
||||||
@ -26,36 +24,18 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
if (!dtos.Any())
|
if (!dtos.Any())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dtos = dtos.Distinct(new TelemetryUserDtoComparer());
|
|
||||||
|
|
||||||
var telemetryId = telemetryService.GetOrCreateTemetryIdByUid(uid);
|
var telemetryId = telemetryService.GetOrCreateTemetryIdByUid(uid);
|
||||||
|
|
||||||
var ids = dtos.Select(e => e.Id).ToList();
|
var entities = dtos.Distinct(new TelemetryUserDtoComparer()).Select(dto => new TelemetryUser
|
||||||
|
|
||||||
var dbIds = (from e in db.TelemetryUsers
|
|
||||||
where e.IdTelemetry == telemetryId && ids.Contains(e.IdUser)
|
|
||||||
select e.IdUser).ToList();
|
|
||||||
|
|
||||||
foreach (var dto in dtos)
|
|
||||||
{
|
{
|
||||||
var entity = new TelemetryUser
|
IdUser = dto.Id,
|
||||||
{
|
IdTelemetry = telemetryId,
|
||||||
IdUser = dto.Id,
|
Level = dto.Level,
|
||||||
IdTelemetry = telemetryId,
|
Name = dto.Name,
|
||||||
Level = dto.Level,
|
Patronymic = dto.Patronymic,
|
||||||
Name = dto.Name,
|
Surname = dto.Surname,
|
||||||
Patronymic = dto.Patronymic,
|
});
|
||||||
Surname = dto.Surname,
|
cacheTelemetryUsers.Upsert(entities);
|
||||||
};
|
|
||||||
|
|
||||||
if (dbIds.Contains(dto.Id))
|
|
||||||
db.TelemetryUsers.Update(entity);
|
|
||||||
else
|
|
||||||
db.TelemetryUsers.Add(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
db.SaveChanges();
|
|
||||||
cacheTUsers.Refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
using AsbCloudDb.Model;
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudDb.Model;
|
||||||
|
using AsbCloudInfrastructure.Services;
|
||||||
|
using AsbCloudInfrastructure.Services.Cache;
|
||||||
|
using AutoMapper;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace ConsoleApp1
|
namespace ConsoleApp1
|
||||||
{
|
{
|
||||||
@ -20,10 +25,46 @@ namespace ConsoleApp1
|
|||||||
{
|
{
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
//var options = new DbContextOptionsBuilder<AsbCloudDbContext>()
|
var options = new DbContextOptionsBuilder<AsbCloudDbContext>()
|
||||||
// .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True")
|
.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True")
|
||||||
// .Options;
|
.Options;
|
||||||
//var context = new AsbCloudDbContext(options);
|
|
||||||
|
var acfg = new MapperConfiguration(cfg => {
|
||||||
|
cfg.CreateMap<DataSaubBase, DataSaubBaseDto>();
|
||||||
|
cfg.CreateMap<DataSaubBaseDto, DataSaubBase>();
|
||||||
|
|
||||||
|
cfg.CreateMap<Message, TelemetryMessageDto>();
|
||||||
|
cfg.CreateMap<TelemetryMessageDto, Message>();
|
||||||
|
|
||||||
|
cfg.CreateMap<TelemetryInfo, TelemetryInfoDto>();
|
||||||
|
cfg.CreateMap<TelemetryInfoDto, TelemetryInfo>();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var context = new AsbCloudDbContext(options);
|
||||||
|
var cachedDb = new CacheDb();
|
||||||
|
var telemetryService = new TelemetryService(context, cachedDb, acfg);
|
||||||
|
var telemetryUserService = new TelemetryUserService(context, cachedDb, telemetryService);
|
||||||
|
|
||||||
|
var tusers = new List<TelemetryUserDto> {
|
||||||
|
new TelemetryUserDto{
|
||||||
|
Id=1,
|
||||||
|
Level=0,
|
||||||
|
Name="Adminum",
|
||||||
|
},
|
||||||
|
new TelemetryUserDto{
|
||||||
|
Id=2,
|
||||||
|
Level=0,
|
||||||
|
Name="Adminum2",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
telemetryUserService.Upsert("123", tusers);
|
||||||
|
tusers[0].Patronymic = "Trump";
|
||||||
|
|
||||||
|
|
||||||
|
telemetryUserService.Upsert("123", tusers);
|
||||||
|
|
||||||
|
|
||||||
//var e = new Event
|
//var e = new Event
|
||||||
//{
|
//{
|
||||||
|
Loading…
Reference in New Issue
Block a user