public TMongoDbContext GetDbContext() { Logger.LogWarning( "UnitOfWorkDbContextProvider.GetDbContext is deprecated. Use GetDbContextAsync instead! " + "You are probably using LINQ (LINQ extensions) directly on a repository. In this case, use repository.GetQueryableAsync() method " + "to obtain an IQueryable<T> instance and use LINQ (LINQ extensions) on this object. " ); Logger.LogWarning(Environment.StackTrace.Truncate(2048)); var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException( $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } var connectionString = _connectionStringResolver.Resolve <TMongoDbContext>(); var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); var databaseName = mongoUrl.DatabaseName; if (databaseName.IsNullOrWhiteSpace()) { databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext>(); } //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => new MongoDbDatabaseApi <TMongoDbContext>(CreateDbContext(unitOfWork, mongoUrl, databaseName))); return(((MongoDbDatabaseApi <TMongoDbContext>)databaseApi).DbContext); }
public TMongoDbContext GetDbContext() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException( $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } var connectionString = _connectionStringResolver.Resolve <TMongoDbContext>(); var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); var databaseName = mongoUrl.DatabaseName; if (databaseName.IsNullOrWhiteSpace()) { databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext>(); } //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => new MongoDbDatabaseApi <TMongoDbContext>(CreateDbContext(unitOfWork, mongoUrl, databaseName))); return(((MongoDbDatabaseApi <TMongoDbContext>)databaseApi).DbContext); }
public IMongoDatabase GetDatabase() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException($"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } var connectionString = _connectionStringResolver.Resolve <TMongoDbContext>(); var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}"; string databaseName; if (connectionString.Contains("|")) { var splitted = connectionString.Split('|'); connectionString = splitted[0]; databaseName = splitted[1]; } else { databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext>(); } //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => new MongoDbDatabaseApi( new MongoClient(connectionString).GetDatabase(databaseName) )); return(((MongoDbDatabaseApi)databaseApi).Database); }
public async Task <TDbContext> GetDbContextAsync() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException("A DbContext can only be created inside a unit of work!"); } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>(); var connectionString = await _connectionStringResolver.ResolveAsync(connectionStringName); var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}"; var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); if (databaseApi == null) { databaseApi = new EfCoreDatabaseApi <TDbContext>( await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString) ); unitOfWork.AddDatabaseApi(dbContextKey, databaseApi); } return(((EfCoreDatabaseApi <TDbContext>)databaseApi).DbContext); }
public TMongoDbContext GetDbContext() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new RocketException($"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } var connectionString = _connectionStringResolver.Resolve <TMongoDbContext> (); var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); var databaseName = mongoUrl.DatabaseName; if (databaseName.IsNullOrWhiteSpace()) { databaseName = ConnectionStringNameAttribute.GetConnStringName <TMongoDbContext> (); } //TODO: 考虑创建一个单例的客户端 MongoDbClient (除了作为示例 MongoClientCache). var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => { var database = new MongoClient(mongoUrl).GetDatabase(databaseName); var dbContext = unitOfWork.ServiceProvider.GetRequiredService <TMongoDbContext> (); dbContext.ToRocketMongoDbContext().InitializeDatabase(database); return(new MongoDbDatabaseApi <TMongoDbContext> (dbContext)); }); return(((MongoDbDatabaseApi <TMongoDbContext>)databaseApi).DbContext); }
public TDbContext GetDbContext() { if (UnitOfWork.EnableObsoleteDbContextCreationWarning && !UnitOfWorkManager.DisableObsoleteDbContextCreationWarning.Value) { Logger.LogWarning( "UnitOfWorkDbContextProvider.GetDbContext is deprecated. Use GetDbContextAsync instead! " + "You are probably using LINQ (LINQ extensions) directly on a repository. In this case, use repository.GetQueryableAsync() method " + "to obtain an IQueryable<T> instance and use LINQ (LINQ extensions) on this object. " ); Logger.LogWarning(Environment.StackTrace.Truncate(2048)); } var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException("A DbContext can only be created inside a unit of work!"); } var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TDbContext)); var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); var connectionString = ResolveConnectionString(connectionStringName); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => new EfCoreDatabaseApi( CreateDbContext(unitOfWork, connectionStringName, connectionString) )); return((TDbContext)((EfCoreDatabaseApi)databaseApi).DbContext); }
public async Task <TDbContext> GetDbContextAsync() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException("A DbContext can only be created inside a unit of work!"); } var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TDbContext)); var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); var connectionString = await ResolveConnectionStringAsync(connectionStringName); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); if (databaseApi == null) { databaseApi = new EfCoreDatabaseApi( await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString) ); unitOfWork.AddDatabaseApi(dbContextKey, databaseApi); } return((TDbContext)((EfCoreDatabaseApi)databaseApi).DbContext); }
/// <summary> /// 获取数据库上下文 /// </summary> /// <returns></returns> /// <exception cref="Exception"></exception> public async Task <TDbContext> GetDbContextAsync() { // 获得当前的可用工作单元。 var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new Exception("A DbContext can only be created inside a unit of work!"); } // 获得数据库连接上下文的连接字符串名称。 // 根据名称解析具体的连接字符串。 var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TDbContext)); var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); var connectionString = await ResolveConnectionStringAsync(connectionStringName); // 构造数据库上下文缓存 Key。 // 从工作单元的缓存当中获取数据库上下文,不存在则调用 CreateDbContext() 创建。 var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); if (databaseApi == null) { databaseApi = new EfDatabaseApi(await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString)); unitOfWork.AddDatabaseApi(dbContextKey, databaseApi); } return((TDbContext)((EfDatabaseApi)databaseApi).DbContext); }
private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider) where TDbContext : ScorpioDbContext <TDbContext> { var context = DbContextCreationContext.Current; if (context != null) { return(context); } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>(); var connectionString = serviceProvider.GetRequiredService <IConnectionStringResolver>().Resolve(connectionStringName); return(new DbContextCreationContext( connectionString )); }
private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider) where TDbContext : AbpDbContext <TDbContext> { var context = DbContextCreationContext.Current; if (context != null) { return(context); } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>(); var connectionString = ResolveConnectionString <TDbContext>(serviceProvider, connectionStringName); return(new DbContextCreationContext( connectionStringName, connectionString )); }
public TDbContext GetDbContext() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new Exception("A DbContext can only be created inside a unit of work!"); } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>(); var connectionString = _connectionStringResolver.Resolve(connectionStringName); var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}"; var databaseApi = unitOfWork.GetOrAddDatabaseApi(dbContextKey, () => new EfCoreDatabaseApi <TDbContext>(CreateDbContext(unitOfWork, connectionStringName, connectionString) )); return(((EfCoreDatabaseApi <TDbContext>)databaseApi).DbContext); }
public async Task <TMongoDbContext> GetDbContextAsync(CancellationToken cancellationToken = default) { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException( $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } var targetDbContextType = _options.GetReplacedTypeOrSelf(typeof(TMongoDbContext)); var connectionString = await ResolveConnectionStringAsync(targetDbContextType); var dbContextKey = $"{targetDbContextType.FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); var databaseName = mongoUrl.DatabaseName; if (databaseName.IsNullOrWhiteSpace()) { databaseName = ConnectionStringNameAttribute.GetConnStringName(targetDbContextType); } //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); if (databaseApi == null) { databaseApi = new MongoDbDatabaseApi( await CreateDbContextAsync( unitOfWork, mongoUrl, databaseName, cancellationToken ) ); unitOfWork.AddDatabaseApi(dbContextKey, databaseApi); } return((TMongoDbContext)((MongoDbDatabaseApi)databaseApi).DbContext); }
private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider) where TDbContext : AbpDbContext <TDbContext> { var context = DbContextCreationContext.Current; if (context != null) { return(context); } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>(); //Use DefaultConnectionStringResolver.Resolve when we remove IConnectionStringResolver.Resolve #pragma warning disable 618 var connectionString = serviceProvider.GetRequiredService <IConnectionStringResolver>().Resolve(connectionStringName); #pragma warning restore 618 return(new DbContextCreationContext( connectionStringName, connectionString )); }
private static DbContextCreationContext GetCreationContext <TDbContext>(IServiceProvider serviceProvider) where TDbContext : DbContext { // 优先从一个 AsyncLocal 当中获取。 var context = DbContextCreationContext.Current; if (context != null) { return(context); } // 从 TDbContext 的 ConnectionStringName 特性获取连接字符串名称。 // 使用 IConnectionStringResolver 根据指定的名称获得连接字符串。 var connectionStringName = ConnectionStringNameAttribute.GetConnStringName <TDbContext>(); var connectionString = ResolveConnectionString <TDbContext>(serviceProvider, connectionStringName); // 构造一个新的 DbContextCreationContext 对象。 return(new DbContextCreationContext( connectionStringName, connectionString )); }
public async Task MigrateAsync() { var dbContexts = _serviceProvider.GetServices <IAbpMongoDbContext>(); var connectionStringResolver = _serviceProvider.GetRequiredService <IConnectionStringResolver>(); foreach (var dbContext in dbContexts) { var connectionString = await connectionStringResolver.ResolveAsync( 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)); } }
public TVfpContext GetDbContext() { var unitOfWork = _unitOfWorkManager.Current; if (unitOfWork == null) { throw new AbpException($"A {nameof(Database)} instance can only be created inside a unit of work!"); } var connectionString = _connectionStringResolver.Resolve <TVfpContext>(); var dbContextKey = $"{typeof(TVfpContext).FullName}_{connectionString}"; //var mongoUrl = new MongoUrl(connectionString); string databaseName = @"D:\GitHub\dados\SincaTeste.dbc"; //mongoUrl.DatabaseName; if (databaseName.IsNullOrWhiteSpace()) { databaseName = ConnectionStringNameAttribute.GetConnStringName <TVfpContext>(); } //TODO: Create only single MongoDbClient per connection string in an application (extract MongoClientCache for example). var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, () => { var database = new DbContext(new VfpConnection(@"D:\GitHub\dados\SincaTeste.dbc"), true); var dbContext = unitOfWork.ServiceProvider.GetRequiredService <TVfpContext>(); dbContext.ToAbpVfpContext().InitializeDatabase(database.Database); return(new VfpDatabaseApi <TVfpContext>(dbContext)); }); return(((VfpDatabaseApi <TVfpContext>)databaseApi).DbContext); }
public static IServiceCollection AddKeyValueDbContext <TKeyValueDbContext>( this IServiceCollection serviceCollection, Action <KeyValueDbContextCreationOptions <TKeyValueDbContext> > builder = null) where TKeyValueDbContext : KeyValueDbContext <TKeyValueDbContext> { serviceCollection.TryAddSingleton <TKeyValueDbContext>(); serviceCollection.TryAddTransient <KeyValueDatabaseOptions <TKeyValueDbContext> >(factory => { var o = new KeyValueDatabaseOptions <TKeyValueDbContext>(); var name = ConnectionStringNameAttribute.GetConnStringName <TKeyValueDbContext>(); o.ConnectionString = factory.GetRequiredService <IConnectionStringResolver>().Resolve(name); return(o); }); var options = new KeyValueDbContextCreationOptions <TKeyValueDbContext>(serviceCollection); builder?.Invoke(options); return(serviceCollection); }
public void Should_Get_ConnStringName_If_Not_Specified() { ConnectionStringNameAttribute .GetConnStringName <MyClassWithConnStringName>() .ShouldBe("MyDb"); }
public static Task <string> ResolveAsync(this IConnectionStringResolver resolver, Type type) { return(resolver.ResolveAsync(ConnectionStringNameAttribute.GetConnStringName(type))); }
public static string Resolve <T> (this IConnectionStringResolver resolver) { return(resolver.Resolve(ConnectionStringNameAttribute.GetConnStringName <T> ())); }
public void Should_Get_Class_FullName_If_Not_ConnStringNameAttribute_Specified() { ConnectionStringNameAttribute .GetConnStringName <MyClassWithoutConnStringName>() .ShouldBe(typeof(MyClassWithoutConnStringName).FullName); }