Browse Source

Use async methods in the mongo repo.

pull/6809/head
Halil İbrahim Kalkan 6 years ago
parent
commit
8f3c527126
  1. 86
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
  2. 24
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs

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

@ -114,28 +114,33 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public override async Task InsertManyAsync(IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default) public override async Task InsertManyAsync(IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default)
{ {
foreach (var entity in entities) var entityArray = entities.ToArray();
foreach (var entity in entityArray)
{ {
await ApplyAbpConceptsForAddedEntityAsync(entity); await ApplyAbpConceptsForAddedEntityAsync(entity);
} }
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
var collection = dbContext.Collection<TEntity>();
if (BulkOperationProvider != null) if (BulkOperationProvider != null)
{ {
await BulkOperationProvider.InsertManyAsync(this, entities, SessionHandle, autoSave, cancellationToken); await BulkOperationProvider.InsertManyAsync(this, entityArray, dbContext.SessionHandle, autoSave, cancellationToken);
return; return;
} }
if (SessionHandle != null) if (dbContext.SessionHandle != null)
{ {
await Collection.InsertManyAsync( await collection.InsertManyAsync(
SessionHandle, dbContext.SessionHandle,
entities, entityArray,
cancellationToken: cancellationToken); cancellationToken: cancellationToken);
} }
else else
{ {
await Collection.InsertManyAsync( await collection.InsertManyAsync(
entities, entityArray,
cancellationToken: cancellationToken); cancellationToken: cancellationToken);
} }
} }
@ -193,12 +198,13 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public override async Task UpdateManyAsync(IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default) public override async Task UpdateManyAsync(IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default)
{ {
var isSoftDeleteEntity = typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)); var entityArray = entities.ToArray();
foreach (var entity in entities) foreach (var entity in entityArray)
{ {
SetModificationAuditProperties(entity); SetModificationAuditProperties(entity);
var isSoftDeleteEntity = typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity));
if (isSoftDeleteEntity) if (isSoftDeleteEntity)
{ {
SetDeletionAuditProperties(entity); SetDeletionAuditProperties(entity);
@ -214,31 +220,34 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
SetNewConcurrencyStamp(entity); SetNewConcurrencyStamp(entity);
} }
cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken);
if (BulkOperationProvider != null) if (BulkOperationProvider != null)
{ {
await BulkOperationProvider.UpdateManyAsync(this, entities, SessionHandle, autoSave, cancellationToken); await BulkOperationProvider.UpdateManyAsync(this, entityArray, dbContext.SessionHandle, autoSave, cancellationToken);
return; return;
} }
var entitiesCount = entities.Count();
BulkWriteResult result; BulkWriteResult result;
List<WriteModel<TEntity>> replaceRequests = new List<WriteModel<TEntity>>(); List<WriteModel<TEntity>> replaceRequests = new List<WriteModel<TEntity>>();
foreach (var entity in entities) foreach (var entity in entityArray)
{ {
replaceRequests.Add(new ReplaceOneModel<TEntity>(CreateEntityFilter(entity), entity)); replaceRequests.Add(new ReplaceOneModel<TEntity>(CreateEntityFilter(entity), entity));
} }
if (SessionHandle != null) var collection = dbContext.Collection<TEntity>();
if (dbContext.SessionHandle != null)
{ {
result = await Collection.BulkWriteAsync(SessionHandle, replaceRequests); result = await collection.BulkWriteAsync(dbContext.SessionHandle, replaceRequests, cancellationToken: cancellationToken);
} }
else else
{ {
result = await Collection.BulkWriteAsync(replaceRequests); result = await collection.BulkWriteAsync(replaceRequests, cancellationToken: cancellationToken);
} }
if (result.MatchedCount < entitiesCount) if (result.MatchedCount < entityArray.Length)
{ {
ThrowOptimisticConcurrencyException(); ThrowOptimisticConcurrencyException();
} }
@ -315,35 +324,40 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool autoSave = false, bool autoSave = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
foreach (var entity in entities) var entityArray = entities.ToArray();
foreach (var entity in entityArray)
{ {
await ApplyAbpConceptsForDeletedEntityAsync(entity); await ApplyAbpConceptsForDeletedEntityAsync(entity);
var oldConcurrencyStamp = SetNewConcurrencyStamp(entity); SetNewConcurrencyStamp(entity);
} }
var dbContext = await GetDbContextAsync(GetCancellationToken(cancellationToken));
var collection = dbContext.Collection<TEntity>();
if (BulkOperationProvider != null) if (BulkOperationProvider != null)
{ {
await BulkOperationProvider.DeleteManyAsync(this, entities, SessionHandle, autoSave, cancellationToken); await BulkOperationProvider.DeleteManyAsync(this, entityArray, dbContext.SessionHandle, autoSave, cancellationToken);
return; return;
} }
var entitiesCount = entities.Count(); var entitiesCount = entityArray.Count();
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity))) if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
{ {
UpdateResult updateResult; UpdateResult updateResult;
if (SessionHandle != null) if (dbContext.SessionHandle != null)
{ {
updateResult = await Collection.UpdateManyAsync( updateResult = await collection.UpdateManyAsync(
SessionHandle, dbContext.SessionHandle,
CreateEntitiesFilter(entities), CreateEntitiesFilter(entityArray),
Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true) Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
); );
} }
else else
{ {
updateResult = await Collection.UpdateManyAsync( updateResult = await collection.UpdateManyAsync(
CreateEntitiesFilter(entities), CreateEntitiesFilter(entityArray),
Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true) Builders<TEntity>.Update.Set(x => ((ISoftDelete)x).IsDeleted, true)
); );
} }
@ -356,17 +370,17 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
else else
{ {
DeleteResult deleteResult; DeleteResult deleteResult;
if (SessionHandle != null) if (dbContext.SessionHandle != null)
{ {
deleteResult = await Collection.DeleteManyAsync( deleteResult = await collection.DeleteManyAsync(
SessionHandle, dbContext.SessionHandle,
CreateEntitiesFilter(entities) CreateEntitiesFilter(entityArray)
); );
} }
else else
{ {
deleteResult = await Collection.DeleteManyAsync( deleteResult = await collection.DeleteManyAsync(
CreateEntitiesFilter(entities) CreateEntitiesFilter(entityArray)
); );
} }
@ -689,9 +703,11 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public virtual async Task DeleteManyAsync([NotNull] IEnumerable<TKey> ids, bool autoSave = false, CancellationToken cancellationToken = default) public virtual async Task DeleteManyAsync([NotNull] IEnumerable<TKey> ids, bool autoSave = false, CancellationToken cancellationToken = default)
{ {
var entities = await GetMongoQueryable() cancellationToken = GetCancellationToken(cancellationToken);
var entities = await (await GetMongoQueryableAsync(cancellationToken))
.Where(x => ids.Contains(x.Id)) .Where(x => ids.Contains(x.Id))
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(cancellationToken);
await DeleteManyAsync(entities, autoSave, cancellationToken); await DeleteManyAsync(entities, autoSave, cancellationToken);
} }

24
framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using MongoDB.Driver; using MongoDB.Driver;
using MongoDB.Driver.Linq; using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
@ -8,24 +9,45 @@ namespace Volo.Abp.Domain.Repositories
{ {
public static class MongoDbCoreRepositoryExtensions public static class MongoDbCoreRepositoryExtensions
{ {
[Obsolete("Use GetDatabaseAsync method.")]
public static IMongoDatabase GetDatabase<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository) public static IMongoDatabase GetDatabase<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey> where TEntity : class, IEntity<TKey>
{ {
return repository.ToMongoDbRepository().Database; return repository.ToMongoDbRepository().Database;
} }
public static Task<IMongoDatabase> GetDatabaseAsync<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey>
{
return repository.ToMongoDbRepository().GetDatabaseAsync();
}
[Obsolete("Use GetCollection method.")]
public static IMongoCollection<TEntity> GetCollection<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository) public static IMongoCollection<TEntity> GetCollection<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey> where TEntity : class, IEntity<TKey>
{ {
return repository.ToMongoDbRepository().Collection; return repository.ToMongoDbRepository().Collection;
} }
public static Task<IMongoCollection<TEntity>> GetCollectionAsync<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey>
{
return repository.ToMongoDbRepository().GetCollectionAsync();
}
[Obsolete("Use GetMongoQueryableAsync method.")]
public static IMongoQueryable<TEntity> GetMongoQueryable<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository) public static IMongoQueryable<TEntity> GetMongoQueryable<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey> where TEntity : class, IEntity<TKey>
{ {
return repository.ToMongoDbRepository().GetMongoQueryable(); return repository.ToMongoDbRepository().GetMongoQueryable();
} }
public static Task<IMongoQueryable<TEntity>> GetMongoQueryableAsync<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey>
{
return repository.ToMongoDbRepository().GetMongoQueryableAsync();
}
public static IMongoDbRepository<TEntity, TKey> ToMongoDbRepository<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository) public static IMongoDbRepository<TEntity, TKey> ToMongoDbRepository<TEntity, TKey>(this IBasicRepository<TEntity, TKey> repository)
where TEntity : class, IEntity<TKey> where TEntity : class, IEntity<TKey>
{ {
@ -38,4 +60,4 @@ namespace Volo.Abp.Domain.Repositories
return mongoDbRepository; return mongoDbRepository;
} }
} }
} }

Loading…
Cancel
Save