Browse Source

Merge pull request #5174 from abpframework/liangshiwei/mongodb-transaction

MongoDB module ACID transaction implementation
pull/5427/head
Halil İbrahim Kalkan 6 years ago
committed by GitHub
parent
commit
b48689ccf1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj
  2. 102
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs
  3. 14
      framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbContext.cs
  4. 13
      framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs
  5. 27
      framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs
  6. 4
      framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/IAbpMongoDbContext.cs
  7. 19
      framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelBuilder.cs
  8. 6
      framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelSource.cs
  9. 42
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs
  10. 63
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
  11. 12
      framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs
  12. 12
      modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbTestModule.cs
  13. 12
      modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo/Abp/BackgroundJobs/MongoDB/AbpBackgroundJobsMongoDbTestModule.cs
  14. 14
      modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/BlobStoringDatabaseMongoDbTestModule.cs
  15. 12
      modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo/Blogging/MongoDB/BloggingMongoDBTestModule.cs
  16. 14
      modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/CmsKitMongoDbTestModule.cs
  17. 10
      modules/docs/test/Volo.Docs.MongoDB.Tests/Volo/Docs/MongoDB/DocsMongoDBTestModule.cs
  18. 12
      modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo/Abp/FeatureManagement/MongoDB/AbpFeatureManagementMongoDbTestModule.cs
  19. 12
      modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbTestModule.cs
  20. 8
      modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs
  21. 12
      modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbTestModule.cs
  22. 10
      modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo/Abp/SettingManagement/MongoDB/AbpSettingManagementMongoDbTestModule.cs
  23. 10
      modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/AbpTenantManagementMongoDbTestModule.cs
  24. 2
      modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/MongoDbFixture.cs
  25. 46
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MongoDbMyProjectNameDbSchemaMigrator.cs
  26. 8
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDb/MyProjectNameMongoDbTestModule.cs
  27. 12
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestModule.cs

2
framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj

@ -15,7 +15,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MongoDB.Driver" Version="2.10.4" /> <PackageReference Include="MongoDB.Driver" Version="2.11.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

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

@ -29,6 +29,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public virtual IMongoDatabase Database => DbContext.Database; public virtual IMongoDatabase Database => DbContext.Database;
public virtual IClientSessionHandle SessionHandle => DbContext.SessionHandle;
public virtual TMongoDbContext DbContext => DbContextProvider.GetDbContext(); public virtual TMongoDbContext DbContext => DbContextProvider.GetDbContext();
protected IMongoDbContextProvider<TMongoDbContext> DbContextProvider { get; } protected IMongoDbContextProvider<TMongoDbContext> DbContextProvider { get; }
@ -60,10 +62,21 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
{ {
await ApplyAbpConceptsForAddedEntityAsync(entity); await ApplyAbpConceptsForAddedEntityAsync(entity);
await Collection.InsertOneAsync( if (SessionHandle != null)
entity, {
cancellationToken: GetCancellationToken(cancellationToken) await Collection.InsertOneAsync(
); SessionHandle,
entity,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
else
{
await Collection.InsertOneAsync(
entity,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
return entity; return entity;
} }
@ -88,12 +101,27 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
await TriggerDomainEventsAsync(entity); await TriggerDomainEventsAsync(entity);
var oldConcurrencyStamp = SetNewConcurrencyStamp(entity); var oldConcurrencyStamp = SetNewConcurrencyStamp(entity);
ReplaceOneResult result;
if (SessionHandle != null)
{
result = await Collection.ReplaceOneAsync(
SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
cancellationToken: GetCancellationToken(cancellationToken)
);
var result = await Collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp), }
entity, else
cancellationToken: GetCancellationToken(cancellationToken) {
); result = await Collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
if (result.MatchedCount <= 0) if (result.MatchedCount <= 0)
{ {
@ -114,11 +142,25 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
if (entity is ISoftDelete softDeleteEntity && !IsHardDeleted(entity)) if (entity is ISoftDelete softDeleteEntity && !IsHardDeleted(entity))
{ {
softDeleteEntity.IsDeleted = true; softDeleteEntity.IsDeleted = true;
var result = await Collection.ReplaceOneAsync( ReplaceOneResult result;
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity, if (SessionHandle != null)
cancellationToken: GetCancellationToken(cancellationToken) {
); result = await Collection.ReplaceOneAsync(
SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
else
{
result = await Collection.ReplaceOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp),
entity,
cancellationToken: GetCancellationToken(cancellationToken)
);
}
if (result.MatchedCount <= 0) if (result.MatchedCount <= 0)
{ {
@ -127,10 +169,23 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
} }
else else
{ {
var result = await Collection.DeleteOneAsync( DeleteResult result;
CreateEntityFilter(entity, true, oldConcurrencyStamp),
GetCancellationToken(cancellationToken) if (SessionHandle != null)
); {
result = await Collection.DeleteOneAsync(
SessionHandle,
CreateEntityFilter(entity, true, oldConcurrencyStamp),
cancellationToken: GetCancellationToken(cancellationToken)
);
}
else
{
result = await Collection.DeleteOneAsync(
CreateEntityFilter(entity, true, oldConcurrencyStamp),
GetCancellationToken(cancellationToken)
);
}
if (result.DeletedCount <= 0) if (result.DeletedCount <= 0)
{ {
@ -195,9 +250,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
public virtual IMongoQueryable<TEntity> GetMongoQueryable() public virtual IMongoQueryable<TEntity> GetMongoQueryable()
{ {
return ApplyDataFilters( return ApplyDataFilters(SessionHandle != null ? Collection.AsQueryable(SessionHandle) : Collection.AsQueryable());
Collection.AsQueryable()
);
} }
protected virtual bool IsHardDeleted(TEntity entity) protected virtual bool IsHardDeleted(TEntity entity)
{ {
@ -404,6 +457,13 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
bool includeDetails = true, bool includeDetails = true,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
if (SessionHandle != null)
{
return await Collection
.Find(SessionHandle, RepositoryFilterer.CreateEntityFilter(id, true))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
return await Collection return await Collection
.Find(RepositoryFilterer.CreateEntityFilter(id, true)) .Find(RepositoryFilterer.CreateEntityFilter(id, true))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); .FirstOrDefaultAsync(GetCancellationToken(cancellationToken));

14
framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbContext.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -10,14 +11,17 @@ namespace Volo.Abp.MongoDB
public IMongoDatabase Database { get; private set; } public IMongoDatabase Database { get; private set; }
public IClientSessionHandle SessionHandle { get; private set; }
protected internal virtual void CreateModel(IMongoModelBuilder modelBuilder) protected internal virtual void CreateModel(IMongoModelBuilder modelBuilder)
{ {
} }
public virtual void InitializeDatabase(IMongoDatabase database) public virtual void InitializeDatabase(IMongoDatabase database, IClientSessionHandle sessionHandle)
{ {
Database = database; Database = database;
SessionHandle = sessionHandle;
} }
public virtual IMongoCollection<T> Collection<T>() public virtual IMongoCollection<T> Collection<T>()
@ -25,6 +29,12 @@ namespace Volo.Abp.MongoDB
return Database.GetCollection<T>(GetCollectionName<T>()); return Database.GetCollection<T>(GetCollectionName<T>());
} }
public virtual void InitializeCollections(IMongoDatabase database)
{
Database = database;
ModelSource.GetModel(this);
}
protected virtual string GetCollectionName<T>() protected virtual string GetCollectionName<T>()
{ {
return GetEntityModel<T>().CollectionName; return GetEntityModel<T>().CollectionName;
@ -42,4 +52,4 @@ namespace Volo.Abp.MongoDB
return model; return model;
} }
} }
} }

13
framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs

@ -1,7 +1,9 @@
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Domain; using Volo.Abp.Domain;
using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.MongoDB.DependencyInjection;
using Volo.Abp.Uow.MongoDB; using Volo.Abp.Uow.MongoDB;
namespace Volo.Abp.MongoDB namespace Volo.Abp.MongoDB
@ -9,18 +11,23 @@ namespace Volo.Abp.MongoDB
[DependsOn(typeof(AbpDddDomainModule))] [DependsOn(typeof(AbpDddDomainModule))]
public class AbpMongoDbModule : AbpModule public class AbpMongoDbModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddConventionalRegistrar(new AbpMongoDbConventionalRegistrar());
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
context.Services.TryAddTransient( context.Services.TryAddTransient(
typeof(IMongoDbContextProvider<>), typeof(IMongoDbContextProvider<>),
typeof(UnitOfWorkMongoDbContextProvider<>) typeof(UnitOfWorkMongoDbContextProvider<>)
); );
context.Services.TryAddTransient( context.Services.TryAddTransient(
typeof(IMongoDbRepositoryFilterer<>), typeof(IMongoDbRepositoryFilterer<>),
typeof(MongoDbRepositoryFilterer<>) typeof(MongoDbRepositoryFilterer<>)
); );
context.Services.TryAddTransient( context.Services.TryAddTransient(
typeof(IMongoDbRepositoryFilterer<,>), typeof(IMongoDbRepositoryFilterer<,>),
typeof(MongoDbRepositoryFilterer<,>) typeof(MongoDbRepositoryFilterer<,>)

27
framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DependencyInjection/AbpMongoDbConventionalRegistrar.cs

@ -0,0 +1,27 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MongoDB.DependencyInjection
{
public class AbpMongoDbConventionalRegistrar : DefaultConventionalRegistrar
{
public override void AddType(IServiceCollection services, Type type)
{
if (!typeof(IAbpMongoDbContext).IsAssignableFrom(type) || type == typeof(AbpMongoDbContext))
{
return;
}
var dependencyAttribute = GetDependencyAttributeOrNull(type);
var lifeTime = GetLifeTimeOrNull(type, dependencyAttribute);
if (lifeTime == null)
{
return;
}
services.Add(ServiceDescriptor.Describe(typeof(IAbpMongoDbContext), type, ServiceLifetime.Transient));
}
}
}

4
framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/IAbpMongoDbContext.cs

@ -7,5 +7,7 @@ namespace Volo.Abp.MongoDB
IMongoDatabase Database { get; } IMongoDatabase Database { get; }
IMongoCollection<T> Collection<T>(); IMongoCollection<T> Collection<T>();
IClientSessionHandle SessionHandle { get; }
} }
} }

19
framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelBuilder.cs

@ -3,6 +3,8 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using MongoDB.Bson;
using MongoDB.Driver;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
namespace Volo.Abp.MongoDB namespace Volo.Abp.MongoDB
@ -18,7 +20,7 @@ namespace Volo.Abp.MongoDB
_entityModelBuilders = new Dictionary<Type, object>(); _entityModelBuilders = new Dictionary<Type, object>();
} }
public MongoDbContextModel Build() public MongoDbContextModel Build(AbpMongoDbContext dbContext)
{ {
lock (SyncObj) lock (SyncObj)
{ {
@ -38,6 +40,8 @@ namespace Volo.Abp.MongoDB
} }
baseClasses.AddRange(entityModel.EntityType.GetBaseClasses(includeObject: false)); baseClasses.AddRange(entityModel.EntityType.GetBaseClasses(includeObject: false));
CreateCollectionIfNotExists(dbContext, entityModel.CollectionName);
} }
baseClasses = baseClasses.Distinct().ToList(); baseClasses = baseClasses.Distinct().ToList();
@ -84,5 +88,16 @@ namespace Volo.Abp.MongoDB
{ {
return _entityModelBuilders.Values.Cast<IMongoEntityModel>().ToImmutableList(); return _entityModelBuilders.Values.Cast<IMongoEntityModel>().ToImmutableList();
} }
protected virtual void CreateCollectionIfNotExists(AbpMongoDbContext dbContext, string collectionName)
{
var filter = new BsonDocument("name", collectionName);
var options = new ListCollectionNamesOptions { Filter = filter };
if (!dbContext.Database.ListCollectionNames(options).Any())
{
dbContext.Database.CreateCollection(collectionName);
}
}
} }
} }

6
framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/MongoModelSource.cs

@ -12,7 +12,7 @@ namespace Volo.Abp.MongoDB
public class MongoModelSource : IMongoModelSource, ISingletonDependency public class MongoModelSource : IMongoModelSource, ISingletonDependency
{ {
protected readonly ConcurrentDictionary<Type, MongoDbContextModel> ModelCache = new ConcurrentDictionary<Type, MongoDbContextModel>(); protected readonly ConcurrentDictionary<Type, MongoDbContextModel> ModelCache = new ConcurrentDictionary<Type, MongoDbContextModel>();
public virtual MongoDbContextModel GetModel(AbpMongoDbContext dbContext) public virtual MongoDbContextModel GetModel(AbpMongoDbContext dbContext)
{ {
return ModelCache.GetOrAdd( return ModelCache.GetOrAdd(
@ -26,7 +26,7 @@ namespace Volo.Abp.MongoDB
var modelBuilder = CreateModelBuilder(); var modelBuilder = CreateModelBuilder();
BuildModelFromDbContextType(modelBuilder, dbContext.GetType()); BuildModelFromDbContextType(modelBuilder, dbContext.GetType());
BuildModelFromDbContextInstance(modelBuilder, dbContext); BuildModelFromDbContextInstance(modelBuilder, dbContext);
return modelBuilder.Build(); return modelBuilder.Build(dbContext);
} }
protected virtual MongoModelBuilder CreateModelBuilder() protected virtual MongoModelBuilder CreateModelBuilder()
@ -65,4 +65,4 @@ namespace Volo.Abp.MongoDB
dbContext.CreateModel(modelBuilder); dbContext.CreateModel(modelBuilder);
} }
} }
} }

42
framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs

@ -0,0 +1,42 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Driver;
namespace Volo.Abp.Uow.MongoDB
{
public class MongoDbTransactionApi : ITransactionApi, ISupportsRollback
{
public IClientSessionHandle SessionHandle { get; }
public MongoDbTransactionApi(IClientSessionHandle sessionHandle)
{
SessionHandle = sessionHandle;
}
public async Task CommitAsync()
{
await SessionHandle.CommitTransactionAsync();
}
protected void Commit()
{
SessionHandle.CommitTransaction();
}
public void Dispose()
{
SessionHandle.Dispose();
}
public void Rollback()
{
SessionHandle.AbortTransaction();
}
public async Task RollbackAsync(CancellationToken cancellationToken)
{
await SessionHandle.AbortTransactionAsync(cancellationToken);
}
}
}

63
framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs

@ -1,5 +1,6 @@
using System; using System;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
@ -25,7 +26,8 @@ namespace Volo.Abp.Uow.MongoDB
var unitOfWork = _unitOfWorkManager.Current; var unitOfWork = _unitOfWorkManager.Current;
if (unitOfWork == null) if (unitOfWork == null)
{ {
throw new AbpException($"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); throw new AbpException(
$"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!");
} }
var connectionString = _connectionStringResolver.Resolve<TMongoDbContext>(); var connectionString = _connectionStringResolver.Resolve<TMongoDbContext>();
@ -41,18 +43,61 @@ namespace Volo.Abp.Uow.MongoDB
//TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example).
var databaseApi = unitOfWork.GetOrAddDatabaseApi( var databaseApi = unitOfWork.GetOrAddDatabaseApi(
dbContextKey, dbContextKey,
() => () => new MongoDbDatabaseApi<TMongoDbContext>(CreateDbContext(unitOfWork, mongoUrl, databaseName)));
return ((MongoDbDatabaseApi<TMongoDbContext>) databaseApi).DbContext;
}
private TMongoDbContext CreateDbContext(IUnitOfWork unitOfWork, MongoUrl mongoUrl, string databaseName)
{
var client = new MongoClient(mongoUrl);
var database = client.GetDatabase(databaseName);
if (unitOfWork.Options.IsTransactional)
{
return CreateDbContextWithTransaction(unitOfWork, mongoUrl, client, database);
}
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TMongoDbContext>();
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, null);
return dbContext;
}
public TMongoDbContext CreateDbContextWithTransaction(
IUnitOfWork unitOfWork,
MongoUrl url,
MongoClient client,
IMongoDatabase database)
{
var transactionApiKey = $"MongoDb_{url}";
var activeTransaction = unitOfWork.FindTransactionApi(transactionApiKey) as MongoDbTransactionApi;
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TMongoDbContext>();
if (activeTransaction?.SessionHandle == null)
{
var session = client.StartSession();
if (unitOfWork.Options.Timeout.HasValue)
{ {
var database = new MongoClient(mongoUrl).GetDatabase(databaseName); session.AdvanceOperationTime(new BsonTimestamp(unitOfWork.Options.Timeout.Value));
}
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TMongoDbContext>(); session.StartTransaction();
dbContext.ToAbpMongoDbContext().InitializeDatabase(database); unitOfWork.AddTransactionApi(
transactionApiKey,
new MongoDbTransactionApi(session)
);
return new MongoDbDatabaseApi<TMongoDbContext>(dbContext); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, session);
}); }
else
{
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, activeTransaction.SessionHandle);
}
return ((MongoDbDatabaseApi<TMongoDbContext>)databaseApi).DbContext; return dbContext;
} }
} }
} }

12
framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/AbpMongoDbTestModule.cs

@ -1,10 +1,15 @@
using System; using System;
using System.Linq;
using System.Threading;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using MongoDB.Driver.Core.Servers;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.TestApp; using Volo.Abp.TestApp;
using Volo.Abp.TestApp.Domain; using Volo.Abp.TestApp.Domain;
using Volo.Abp.TestApp.MongoDB; using Volo.Abp.TestApp.MongoDB;
using Volo.Abp.Uow;
namespace Volo.Abp.MongoDB namespace Volo.Abp.MongoDB
{ {
@ -16,7 +21,7 @@ namespace Volo.Abp.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
@ -30,6 +35,11 @@ namespace Volo.Abp.MongoDB
options.AddDefaultRepositories<ITestAppMongoDbContext>(); options.AddDefaultRepositories<ITestAppMongoDbContext>();
options.AddRepository<City, CityRepository>(); options.AddRepository<City, CityRepository>();
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo/Abp/AuditLogging/MongoDB/AbpAuditLoggingMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.AuditLogging.MongoDB namespace Volo.Abp.AuditLogging.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Abp.AuditLogging.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo/Abp/BackgroundJobs/MongoDB/AbpBackgroundJobsMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.BackgroundJobs.MongoDB namespace Volo.Abp.BackgroundJobs.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Abp.BackgroundJobs.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

14
modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/MongoDB/BlobStoringDatabaseMongoDbTestModule.cs

@ -1,25 +1,31 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.BlobStoring.Database.MongoDB namespace Volo.Abp.BlobStoring.Database.MongoDB
{ {
[DependsOn( [DependsOn(
typeof(BlobStoringDatabaseTestBaseModule), typeof(BlobStoringDatabaseTestBaseModule),
typeof(BlobStoringDatabaseMongoDbModule) typeof(BlobStoringDatabaseMongoDbModule)
)] )]
public class BlobStoringDatabaseMongoDbTestModule : AbpModule public class BlobStoringDatabaseMongoDbTestModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo/Blogging/MongoDB/BloggingMongoDBTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Blogging.MongoDB namespace Volo.Blogging.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Blogging.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

14
modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/CmsKitMongoDbTestModule.cs

@ -1,25 +1,31 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.CmsKit.MongoDB namespace Volo.CmsKit.MongoDB
{ {
[DependsOn( [DependsOn(
typeof(CmsKitTestBaseModule), typeof(CmsKitTestBaseModule),
typeof(CmsKitMongoDbModule) typeof(CmsKitMongoDbModule)
)] )]
public class CmsKitMongoDbTestModule : AbpModule public class CmsKitMongoDbTestModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

10
modules/docs/test/Volo.Docs.MongoDB.Tests/Volo/Docs/MongoDB/DocsMongoDBTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Docs.MongoDB namespace Volo.Docs.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Docs.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo/Abp/FeatureManagement/MongoDB/AbpFeatureManagementMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.FeatureManagement.MongoDB namespace Volo.Abp.FeatureManagement.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Abp.FeatureManagement.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
using Volo.Abp.PermissionManagement.MongoDB; using Volo.Abp.PermissionManagement.MongoDB;
namespace Volo.Abp.Identity.MongoDB namespace Volo.Abp.Identity.MongoDB
@ -9,19 +10,24 @@ namespace Volo.Abp.Identity.MongoDB
typeof(AbpIdentityTestBaseModule), typeof(AbpIdentityTestBaseModule),
typeof(AbpPermissionManagementMongoDbModule), typeof(AbpPermissionManagementMongoDbModule),
typeof(AbpIdentityMongoDbModule) typeof(AbpIdentityMongoDbModule)
)] )]
public class AbpIdentityMongoDbTestModule : AbpModule public class AbpIdentityMongoDbTestModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

8
modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs

@ -3,6 +3,7 @@ using Volo.Abp.Data;
using Volo.Abp.Identity.MongoDB; using Volo.Abp.Identity.MongoDB;
using Volo.Abp.IdentityServer.MongoDB; using Volo.Abp.IdentityServer.MongoDB;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.IdentityServer namespace Volo.Abp.IdentityServer
{ {
@ -16,7 +17,7 @@ namespace Volo.Abp.IdentityServer
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
@ -24,6 +25,11 @@ namespace Volo.Abp.IdentityServer
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo/Abp/PermissionManagement/MongoDb/AbpPermissionManagementMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.PermissionManagement.MongoDB namespace Volo.Abp.PermissionManagement.MongoDB
{ {
@ -11,14 +12,19 @@ namespace Volo.Abp.PermissionManagement.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

10
modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo/Abp/SettingManagement/MongoDB/AbpSettingManagementMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.SettingManagement.MongoDB namespace Volo.Abp.SettingManagement.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Abp.SettingManagement.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

10
modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/AbpTenantManagementMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.TenantManagement.MongoDB namespace Volo.Abp.TenantManagement.MongoDB
{ {
@ -12,14 +13,19 @@ namespace Volo.Abp.TenantManagement.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

2
modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo/Abp/TenantManagement/MongoDb/MongoDbFixture.cs

@ -1,5 +1,7 @@
using System; using System;
using Mongo2Go; using Mongo2Go;
using MongoDB.Driver;
using Volo.Abp.MongoDB;
namespace Volo.Abp.TenantManagement.MongoDB namespace Volo.Abp.TenantManagement.MongoDB
{ {

46
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MongoDbMyProjectNameDbSchemaMigrator.cs

@ -0,0 +1,46 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using MyCompanyName.MyProjectName.Data;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MongoDB;
namespace MyCompanyName.MyProjectName.MongoDB
{
public class MongoDbMyProjectNameDbSchemaMigrator : IMyProjectNameDbSchemaMigrator , ITransientDependency
{
private readonly IServiceProvider _serviceProvider;
public MongoDbMyProjectNameDbSchemaMigrator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public Task MigrateAsync()
{
var dbContexts = _serviceProvider.GetServices<IAbpMongoDbContext>();
var connectionStringResolver = _serviceProvider.GetService<IConnectionStringResolver>();
foreach (var dbContext in dbContexts)
{
var connectionString =
connectionStringResolver.Resolve(
ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()));
var mongoUrl = new MongoUrl(connectionString);
var databaseName = mongoUrl.DatabaseName;
var client = new MongoClient(mongoUrl);
if (databaseName.IsNullOrWhiteSpace())
{
databaseName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
}
(dbContext as AbpMongoDbContext)?.InitializeCollections(client.GetDatabase(databaseName));
}
return Task.CompletedTask;
}
}
}

8
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDb/MyProjectNameMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.MongoDB
{ {
@ -12,7 +13,7 @@ namespace MyCompanyName.MyProjectName.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MyProjectNameMongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MyProjectNameMongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
@ -20,6 +21,11 @@ namespace MyCompanyName.MyProjectName.MongoDB
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

12
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestModule.cs

@ -1,6 +1,7 @@
using System; using System;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.MongoDB
{ {
@ -12,14 +13,19 @@ namespace MyCompanyName.MyProjectName.MongoDB
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') + var connectionString = MongoDbFixture.ConnectionString.EnsureEndsWith('/') +
"Db_" + "Db_" +
Guid.NewGuid().ToString("N"); Guid.NewGuid().ToString("N");
Configure<AbpDbConnectionOptions>(options => Configure<AbpDbConnectionOptions>(options =>
{ {
options.ConnectionStrings.Default = connectionString; options.ConnectionStrings.Default = connectionString;
}); });
Configure<AbpUnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
});
} }
} }
} }

Loading…
Cancel
Save