Browse Source

Framework - Consider hard deleted entities in MongoDbRepository

pull/7478/head
enisn 6 years ago
parent
commit
8e4a8de028
  1. 100
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs

100
framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs

@ -314,16 +314,26 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
} }
public override async Task DeleteManyAsync( public override async Task DeleteManyAsync(
IEnumerable<TEntity> entities, IEnumerable<TEntity> entities,
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var entityArray = entities.ToArray(); var softDeletedEntities = new List<TEntity>();
var hardDeletedEntities = new List<TEntity>();
foreach (var entity in entityArray) foreach (var entity in entities)
{ {
await ApplyAbpConceptsForDeletedEntityAsync(entity); await ApplyAbpConceptsForDeletedEntityAsync(entity);
SetNewConcurrencyStamp(entity); SetNewConcurrencyStamp(entity);
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && !IsHardDeleted(entity))
{
softDeletedEntities.Add(entity);
}
else
{
hardDeletedEntities.Add(entity);
}
} }
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken)); var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
@ -331,58 +341,104 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
if (BulkOperationProvider != null) if (BulkOperationProvider != null)
{ {
await BulkOperationProvider.DeleteManyAsync(this, entityArray, dbContext.SessionHandle, autoSave, cancellationToken); await BulkOperationProvider.DeleteManyAsync(this, entities.ToArray(), dbContext.SessionHandle, autoSave, cancellationToken);
return; return;
} }
var entitiesCount = entityArray.Count(); if (softDeletedEntities.Count > 0)
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
{ {
UpdateResult updateResult; UpdateResult updateResult;
var softDeleteEntitiesCount = softDeletedEntities.Count;
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
{ {
updateResult = await collection.UpdateManyAsync( updateResult = await collection.UpdateManyAsync(
dbContext.SessionHandle, dbContext.SessionHandle,
CreateEntitiesFilter(entityArray), CreateEntitiesFilter(softDeletedEntities),
Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true), Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
cancellationToken: cancellationToken); );
} }
else else
{ {
updateResult = await collection.UpdateManyAsync( updateResult = await collection.UpdateManyAsync(
CreateEntitiesFilter(entityArray), CreateEntitiesFilter(softDeletedEntities),
Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true), Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
cancellationToken: cancellationToken); );
} }
if (updateResult.MatchedCount < entitiesCount) if (updateResult.MatchedCount < softDeleteEntitiesCount)
{ {
ThrowOptimisticConcurrencyException(); ThrowOptimisticConcurrencyException();
} }
} }
else
if (hardDeletedEntities.Count > 0)
{ {
DeleteResult deleteResult; DeleteResult deleteResult;
var hardDeletedEntitiesCount = hardDeletedEntities.Count;
if (dbContext.SessionHandle != null) if (dbContext.SessionHandle != null)
{ {
deleteResult = await collection.DeleteManyAsync( deleteResult = await collection.DeleteManyAsync(
dbContext.SessionHandle, dbContext.SessionHandle,
CreateEntitiesFilter(entityArray), CreateEntitiesFilter(hardDeletedEntities)
cancellationToken: cancellationToken); );
} }
else else
{ {
deleteResult = await collection.DeleteManyAsync( deleteResult = await collection.DeleteManyAsync(
CreateEntitiesFilter(entityArray), CreateEntitiesFilter(hardDeletedEntities)
cancellationToken); );
} }
if (deleteResult.DeletedCount < entitiesCount) if (deleteResult.DeletedCount < hardDeletedEntitiesCount)
{ {
ThrowOptimisticConcurrencyException(); ThrowOptimisticConcurrencyException();
} }
} }
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
{
if (softDeletedEntities.Length > 0)
{
}
var hardEntityArray = entities.Except(softDeletedEntities).ToArray();
var hardEntitiesCount = hardEntityArray.Length;
if (hardEntitiesCount > 0)
{
DeleteResult deleteResult;
if (dbContext.SessionHandle != null)
{
deleteResult = await collection.DeleteManyAsync(
dbContext.SessionHandle,
CreateEntitiesFilter(hardEntityArray)
);
}
else
{
deleteResult = await collection.DeleteManyAsync(
CreateEntitiesFilter(hardEntityArray)
);
}
if (deleteResult.DeletedCount < hardEntitiesCount)
{
ThrowOptimisticConcurrencyException();
}
}
}
else
{
}
} }
public override async Task<List<TEntity>> GetListAsync(bool includeDetails = false, CancellationToken cancellationToken = default) public override async Task<List<TEntity>> GetListAsync(bool includeDetails = false, CancellationToken cancellationToken = default)

Loading…
Cancel
Save