public EntityDescriptor(DbOptions dbOptions, DbModuleOptions dbModuleOptions, Type entityType, ISqlAdapter sqlAdapter) { DbOptions = dbOptions; ModuleOptions = dbModuleOptions; ModuleName = dbModuleOptions.Name; SqlAdapter = sqlAdapter; EntityType = entityType; Database = sqlAdapter.Database; PrimaryKey = new PrimaryKeyDescriptor(); //实体基类 IsEntityBase = EntityType.GetInterfaces().Any(m => m == typeof(IBase)); //软删除 IsSoftDelete = EntityType.GetInterfaces().Any(m => m == typeof(ISoftDelete)); SetTableName(); SetIgnore(); SetColumns(); var sqlBuilder = new EntitySqlBuilder(this); Sql = sqlBuilder.Build(); }
public EntityDescriptor(DbModuleOptions dbOptions, Type entityType, ISqlAdapter sqlAdapter) { DbOptions = dbOptions; ModuleName = dbOptions.Name; SqlAdapter = sqlAdapter; EntityType = entityType; Database = sqlAdapter.Database; PrimaryKey = new PrimaryKeyDescriptor(); SoftDelete = EntityType.IsSubclassOfGeneric(typeof(EntityWithSoftDelete <,>)); SetTableName(); SetIgnore(); SetColumns(); var sqlBuilder = new EntitySqlBuilder(this); Sql = sqlBuilder.Build(); IsEntityBase = EntityType.IsSubclassOfGeneric(typeof(EntityBase <>)) || EntityType.IsSubclassOfGeneric(typeof(EntityBaseWithSoftDelete <,>)); }
/// <summary> /// /// </summary> /// <param name="dbOptions"></param> /// <param name="options"></param> /// <param name="loggerFactory"></param> /// <param name="loginInfo"></param> public MySqlDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new MySqlAdapter(dbOptions, options, loggerFactory), loggerFactory, loginInfo) { if (options.ConnectionString.IsNull()) { Check.NotNull(dbOptions.Server, nameof(dbOptions.Server), "数据库服务器地址不能为空"); Check.NotNull(dbOptions.UserId, nameof(dbOptions.UserId), "数据库用户名不能为空"); Check.NotNull(dbOptions.Password, nameof(dbOptions.Password), "数据库密码不能为空"); options.Version = dbOptions.Version; var connStrBuilder = new MySqlConnectionStringBuilder { Server = DbOptions.Server, Port = DbOptions.Port > 0 ? (uint)DbOptions.Port : 3306, Database = options.Database, UserID = DbOptions.UserId, Password = DbOptions.Password, AllowUserVariables = true, CharacterSet = "utf8", SslMode = MySqlSslMode.None, AllowPublicKeyRetrieval = true, MinimumPoolSize = dbOptions.MinPoolSize < 1 ? 0u : dbOptions.MinPoolSize.ToByte(), MaximumPoolSize = dbOptions.MaxPoolSize < 1 ? 10u : dbOptions.MaxPoolSize.ToByte() }; options.ConnectionString = connStrBuilder.ToString(); } }
/// <summary> /// /// </summary> /// <param name="dbOptions"></param> /// <param name="options"></param> /// <param name="sqlAdapter">数据库适配器</param> /// <param name="loggerFactory">日志工厂</param> /// <param name="loginInfo">登录信息</param> protected DbContextOptionsAbstract(DbOptions dbOptions, DbModuleOptions options, ISqlAdapter sqlAdapter, ILoggerFactory loggerFactory, ILoginInfo loginInfo) { if (options.Name.IsNull()) { throw new ArgumentNullException(nameof(options.Name), "数据库连接名称未配置"); } DbOptions = dbOptions; DbModuleOptions = options; SqlAdapter = sqlAdapter; LoggerFactory = loggerFactory; LoginInfo = loginInfo; }
public SqlServerDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new SqlServerAdapter(dbOptions, options), loggerFactory, loginInfo) { Check.NotNull(dbOptions.Server, nameof(dbOptions.Server), "数据库服务器地址不能为空"); Check.NotNull(dbOptions.UserId, nameof(dbOptions.UserId), "数据库用户名不能为空"); Check.NotNull(dbOptions.Password, nameof(dbOptions.Password), "数据库密码不能为空"); options.Version = DbOptions.Version; var connStrBuilder = new SqlConnectionStringBuilder { DataSource = DbOptions.Port > 0 ? DbOptions.Server + "," + DbOptions.Port : DbOptions.Server, UserID = DbOptions.UserId, Password = DbOptions.Password, MultipleActiveResultSets = true, InitialCatalog = DbModuleOptions.Database }; options.ConnectionString = connStrBuilder.ToString(); }
/// <summary> /// /// </summary> /// <param name="dbOptions"></param> /// <param name="options"></param> /// <param name="sqlAdapter">数据库适配器</param> /// <param name="loggerFactory">日志工厂</param> /// <param name="loginInfo">登录信息</param> protected DbContextOptionsAbstract(DbOptions dbOptions, DbModuleOptions options, ISqlAdapter sqlAdapter, ILoggerFactory loggerFactory, ILoginInfo loginInfo) { if (options.Name.IsNull()) { throw new ArgumentNullException(nameof(options.Name), "数据库连接名称未配置"); } DbOptions = dbOptions; DbModuleOptions = options; SqlAdapter = sqlAdapter; LoggerFactory = loggerFactory; LoginInfo = loginInfo; if (options.EntityTypes != null && options.EntityTypes.Any()) { foreach (var entityType in options.EntityTypes) { EntityDescriptorCollection.Add(new EntityDescriptor(dbOptions, options, entityType, sqlAdapter)); } } }
/// <summary> /// /// </summary> /// <param name="dbOptions"></param> /// <param name="options"></param> /// <param name="loggerFactory"></param> /// <param name="loginInfo"></param> public MySqlDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new MySqlAdapter(dbOptions, options), loggerFactory, loginInfo) { Check.NotNull(dbOptions.Server, nameof(dbOptions.Server), "数据库服务器地址不能为空"); Check.NotNull(dbOptions.UserId, nameof(dbOptions.UserId), "数据库用户名不能为空"); Check.NotNull(dbOptions.Password, nameof(dbOptions.Password), "数据库密码不能为空"); options.Version = dbOptions.Version; var connStrBuilder = new MySqlConnectionStringBuilder { Server = DbOptions.Server, Port = DbOptions.Port > 0 ? (uint)DbOptions.Port : 3306, Database = options.Database, UserID = DbOptions.UserId, Password = DbOptions.Password, AllowUserVariables = true, CharacterSet = "utf8", SslMode = MySqlSslMode.None }; options.ConnectionString = connStrBuilder.ToString(); }
public SQLiteDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new SQLiteAdapter(dbOptions, options), loggerFactory, loginInfo) { SqlMapper.AddTypeHandler <Guid>(new GuidTypeHandler()); options.Version = dbOptions.Version; string dbFilePath = Path.Combine(AppContext.BaseDirectory, "Db"); if (DbOptions.Server.NotNull()) { dbFilePath = Path.GetFullPath(DbOptions.Server); } dbFilePath = Path.Combine(dbFilePath, options.Database); var connStrBuilder = new SqliteConnectionStringBuilder { DataSource = $"{dbFilePath}.db", Mode = SqliteOpenMode.ReadWriteCreate }; options.ConnectionString = connStrBuilder.ToString(); }
/// <summary> /// /// </summary> /// <param name="dbOptions"></param> /// <param name="options"></param> /// <param name="loggerFactory"></param> /// <param name="loginInfo"></param> public PostgreSQLDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new PostgreSQLAdapter(dbOptions, options), loggerFactory, loginInfo) { if (options.ConnectionString.IsNull()) { Check.NotNull(dbOptions.Server, nameof(dbOptions.Server), "数据库服务器地址不能为空"); Check.NotNull(dbOptions.UserId, nameof(dbOptions.UserId), "数据库用户名不能为空"); Check.NotNull(dbOptions.Password, nameof(dbOptions.Password), "数据库密码不能为空"); options.Version = dbOptions.Version; var connStrBuilder = new NpgsqlConnectionStringBuilder { Host = DbOptions.Server, Port = DbOptions.Port > 0 ? DbOptions.Port : 5432, Database = "postgres", Username = DbOptions.UserId, Password = DbOptions.Password }; if (dbOptions.NpgsqlDatabaseName.NotNull()) { connStrBuilder.Database = dbOptions.NpgsqlDatabaseName; } options.ConnectionString = connStrBuilder.ToString(); } }
public MySqlAdapter(DbOptions dbOptions, DbModuleOptions options) : base(dbOptions, options) { }
/// <summary> /// 添加数据库上下文 /// </summary> private static void AddDbContext(this IServiceCollection services, IModuleDescriptor module, DbModuleOptions options, DbOptions dbOptions) { var dbContextType = module.AssemblyDescriptor.Infrastructure.GetTypes().FirstOrDefault(m => m.Name.EqualsIgnoreCase(options.Name + "DbContext")); if (dbContextType != null) { var assemblyHelper = new AssemblyHelper(); var dbContextOptionsAssemblyName = assemblyHelper.GetCurrentAssemblyName().Replace("Integration", "") + dbOptions.Dialect; var dbContextOptionsTypeName = dbOptions.Dialect + "DbContextOptions"; var dbContextOptionsType = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(dbContextOptionsAssemblyName)).GetType($"{dbContextOptionsAssemblyName}.{dbContextOptionsTypeName}"); var sp = services.BuildServiceProvider(); //日志工厂 var loggerFactory = dbOptions.Logging ? sp.GetService <ILoggerFactory>() : null; //登录信息 var loginInfo = sp.GetService <ILoginInfo>(); //数据库上下文配置项 var contextOptions = (IDbContextOptions)Activator.CreateInstance(dbContextOptionsType, dbOptions, options, loggerFactory, loginInfo); //数据库创建事件 var createDatabaseEvent = module.AssemblyDescriptor.Infrastructure.GetTypes().FirstOrDefault(m => typeof(IDatabaseCreateEvents).IsAssignableFrom(m)); if (createDatabaseEvent != null) { contextOptions.DatabaseCreateEvents = (IDatabaseCreateEvents)Activator.CreateInstance(createDatabaseEvent); } //注入数据库上下文 var dbContext = Activator.CreateInstance(dbContextType, contextOptions, sp); services.AddSingleton(dbContextType, dbContext); services.AddRepositories(module, (IDbContext)dbContext, dbOptions); } }
/// <summary> /// 加载实体类型列表 /// </summary> /// <param name="module"></param> /// <param name="options"></param> private static void LoadEntityTypes(IModuleDescriptor module, DbModuleOptions options) { options.EntityTypes = module.AssemblyDescriptor.Domain.GetTypes().Where(t => t.IsClass && typeof(IEntity).IsImplementType(t)).ToList(); }
public MySqlAdapter(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory) : base(dbOptions, options, loggerFactory?.CreateLogger <MySqlAdapter>()) { }
public PostgreSQLAdapter(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory) : base(dbOptions, options, loggerFactory?.CreateLogger <PostgreSQLAdapter>()) { }
protected SqlAdapterAbstract(DbOptions dbOptions, DbModuleOptions options, ILogger logger) { DbOptions = dbOptions; Options = options; Logger = logger; }
/// <summary> /// /// </summary> /// <param name="dbOptions"></param> /// <param name="options"></param> /// <param name="loggerFactory"></param> /// <param name="loginInfo"></param> public PostgreSQLDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new PostgreSQLAdapter(dbOptions, options, loggerFactory), loggerFactory, loginInfo) { }
public SQLiteDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new SQLiteAdapter(dbOptions, options, loggerFactory), loggerFactory, loginInfo) { SqlMapper.AddTypeHandler(new GuidTypeHandler()); }
public SqlServerAdapter(DbOptions dbOptions, DbModuleOptions options) : base(dbOptions, options) { }
/// <summary> /// 添加数据库上下文 /// </summary> private static void AddDbContext(this IServiceCollection services, IModuleDescriptor module, DbModuleOptions options, DbOptions dbOptions) { var dbContextType = module.AssemblyDescriptor.Infrastructure.GetTypes().FirstOrDefault(m => m.Name.EqualsIgnoreCase(options.Name + "DbContext")); if (dbContextType != null) { //加载实体列表 LoadEntityTypes(module, options); var dbContextOptionsAssemblyName = AssemblyHelper.GetCurrentAssemblyName().Replace("Integration", "") + dbOptions.Dialect; var dbContextOptionsTypeName = dbOptions.Dialect + "DbContextOptions"; var dbContextOptionsType = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(dbContextOptionsAssemblyName)).GetType($"{dbContextOptionsAssemblyName}.{dbContextOptionsTypeName}"); var sp = services.BuildServiceProvider(); //日志工厂 var loggerFactory = dbOptions.Logging ? sp.GetService <ILoggerFactory>() : null; //登录信息 var loginInfo = sp.GetService <ILoginInfo>(); //数据库上下文配置项 var contextOptions = (IDbContextOptions)Activator.CreateInstance(dbContextOptionsType, dbOptions, options, loggerFactory, loginInfo); //数据库创建事件 var createDatabaseEvent = module.AssemblyDescriptor.Infrastructure.GetTypes().FirstOrDefault(m => typeof(IDatabaseCreateEvents).IsAssignableFrom(m)); if (createDatabaseEvent != null) { contextOptions.DatabaseCreateEvents = (IDatabaseCreateEvents)Activator.CreateInstance(createDatabaseEvent); } //注入数据库上下文 var dbContext = (IDbContext)Activator.CreateInstance(dbContextType, contextOptions, sp); #region ==执行初始化脚本== //当开启初始化脚本 && 开启自动创建数据库 && 数据库不存在 if (dbOptions.InitData && dbOptions.CreateDatabase && !dbContext.DatabaseExists) { var dbScriptPath = ""; switch (dbOptions.Dialect) { case SqlDialect.SqlServer: dbScriptPath = module.InitDataScriptDescriptor.SqlServer; break; case SqlDialect.MySql: dbScriptPath = module.InitDataScriptDescriptor.MySql; break; case SqlDialect.SQLite: dbScriptPath = module.InitDataScriptDescriptor.SQLite; break; case SqlDialect.PostgreSQL: dbScriptPath = module.InitDataScriptDescriptor.PostgreSQL; break; case SqlDialect.Oracle: dbScriptPath = module.InitDataScriptDescriptor.Oracle; break; } if (dbScriptPath.NotNull() && File.Exists(dbScriptPath)) { using var sr = new StreamReader(dbScriptPath); var sql = sr.ReadToEnd(); if (sql.NotNull()) { //此处不能使用IDbContext的NewConnection方法创建连接 var con = dbContext.Options.NewConnection(); con.Execute(sql); } } } #endregion services.AddSingleton(dbContextType, dbContext); services.AddRepositories(module, dbContext, dbOptions); } }
/// <summary> /// 添加数据库上下文 /// </summary> private static void AddDbContext(this IServiceCollection services, IModuleDescriptor module, DbModuleOptions options, DbOptions dbOptions) { var dbContextType = module.AssemblyDescriptor.Infrastructure.GetTypes().FirstOrDefault(m => m.Name.EqualsIgnoreCase(options.Name + "DbContext")); if (dbContextType != null) { //加载实体列表 LoadEntityTypes(module, options); var dbContextOptionsAssemblyName = AssemblyHelper.GetCurrentAssemblyName().Replace("Integration", "") + dbOptions.Dialect; var dbContextOptionsTypeName = dbOptions.Dialect + "DbContextOptions"; var dbContextOptionsType = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(dbContextOptionsAssemblyName)).GetType($"{dbContextOptionsAssemblyName}.{dbContextOptionsTypeName}"); var sp = services.BuildServiceProvider(); //日志工厂 var loggerFactory = dbOptions.Logging ? sp.GetService <ILoggerFactory>() : null; //登录信息 var loginInfo = sp.GetService <ILoginInfo>(); //数据库上下文配置项 var contextOptions = (IDbContextOptions)Activator.CreateInstance(dbContextOptionsType, dbOptions, options, loggerFactory, loginInfo); //数据库创建事件 var createDatabaseEvent = module.AssemblyDescriptor.Infrastructure.GetTypes().FirstOrDefault(m => typeof(IDatabaseCreateEvents).IsAssignableFrom(m)); if (createDatabaseEvent != null) { contextOptions.DatabaseCreateEvents = (IDatabaseCreateEvents)Activator.CreateInstance(createDatabaseEvent); } //创建数据库上下文实例 var dbContext = (IDbContext)Activator.CreateInstance(dbContextType, contextOptions); #region ==执行初始化脚本== //当开启初始化脚本 && 开启自动创建数据库 && 数据库不存在 if (dbOptions.InitData && dbOptions.CreateDatabase && !dbContext.DatabaseExists) { var dbScriptPath = ""; switch (dbOptions.Dialect) { case SqlDialect.SqlServer: dbScriptPath = module.InitDataScriptDescriptor.SqlServer; break; case SqlDialect.MySql: dbScriptPath = module.InitDataScriptDescriptor.MySql; break; case SqlDialect.SQLite: dbScriptPath = module.InitDataScriptDescriptor.SQLite; break; case SqlDialect.PostgreSQL: dbScriptPath = module.InitDataScriptDescriptor.PostgreSQL; break; case SqlDialect.Oracle: dbScriptPath = module.InitDataScriptDescriptor.Oracle; break; } if (dbScriptPath.NotNull() && File.Exists(dbScriptPath)) { using var sr = new StreamReader(dbScriptPath); var sql = sr.ReadToEnd(); if (sql.NotNull()) { if (dbOptions.Dialect == SqlDialect.PostgreSQL) { sql = sql.Replace("[nm_database_name]", options.Database); } //此处不能使用IDbContext的NewConnection方法创建连接 var con = dbContext.Options.NewConnection(); con.Execute(sql); } } var jsonDir = module.InitDataScriptDescriptor.JsonDataDirectory; if (jsonDir.NotNull() && Directory.Exists(jsonDir)) { string[] jsonFiles = Directory.GetFiles(jsonDir, "*.json"); var genericType = typeof(DbSet <>); foreach (var jsonFile in jsonFiles) { string typeName = Path.GetFileNameWithoutExtension(jsonFile); var entityType = dbContext.Options.DbModuleOptions.EntityTypes.Find(a => string.Equals(a.Name, typeName, StringComparison.OrdinalIgnoreCase) || a.Name.EndsWith("Entity") && string.Equals(a.Name.Substring(0, a.Name.Length - 6), typeName, StringComparison.OrdinalIgnoreCase)); if (entityType == null) { continue; } using var sr = new StreamReader(jsonFile); var json = sr.ReadToEnd(); var list = JsonConvert.DeserializeObject(json, typeof(List <>).MakeGenericType(entityType)); var dbSetType = genericType.MakeGenericType(entityType); var db = Activator.CreateInstance(dbSetType, new object[] { dbContext }); dbSetType.GetMethod("BatchInsert").Invoke(db, new object[] { list, 10000, null, null }); } } } #endregion //模块描述设置数据库上下文 module.DbContext = dbContext; //注入数据库上下文 services.AddSingleton(dbContextType, dbContext); services.AddRepositories(module, dbContext, dbOptions); } }
public PostgreSQLAdapter(DbOptions dbOptions, DbModuleOptions options) : base(dbOptions, options) { }
public OracleDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new OracleAdapter(dbOptions, options), loggerFactory, loginInfo) { }
public OracleAdapter(DbOptions dbOptions, DbModuleOptions options) : base(dbOptions, options) { }
public SqlServerDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new SqlServerAdapter(dbOptions, options, loggerFactory), loggerFactory, loginInfo) { }
public SQLiteAdapter(DbOptions dbOptions, DbModuleOptions options) : base(dbOptions, options) { }
protected SqlAdapterAbstract(DbOptions dbOptions, DbModuleOptions options) { DbOptions = dbOptions; Options = options; }