Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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 <,>));
        }
Ejemplo n.º 3
0
        /// <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();
            }
        }
Ejemplo n.º 4
0
        /// <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;
        }
Ejemplo n.º 5
0
        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));
                }
            }
        }
Ejemplo n.º 7
0
        /// <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();
        }
Ejemplo n.º 8
0
        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();
        }
Ejemplo n.º 9
0
        /// <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();
 }
Ejemplo n.º 13
0
 public MySqlAdapter(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory) : base(dbOptions, options, loggerFactory?.CreateLogger <MySqlAdapter>())
 {
 }
Ejemplo n.º 14
0
 public PostgreSQLAdapter(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory) : base(dbOptions, options, loggerFactory?.CreateLogger <PostgreSQLAdapter>())
 {
 }
Ejemplo n.º 15
0
 protected SqlAdapterAbstract(DbOptions dbOptions, DbModuleOptions options, ILogger logger)
 {
     DbOptions = dbOptions;
     Options   = options;
     Logger    = logger;
 }
Ejemplo n.º 16
0
 /// <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)
 {
 }
Ejemplo n.º 17
0
 public SQLiteDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new SQLiteAdapter(dbOptions, options, loggerFactory), loggerFactory, loginInfo)
 {
     SqlMapper.AddTypeHandler(new GuidTypeHandler());
 }
Ejemplo n.º 18
0
 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);
            }
        }
Ejemplo n.º 20
0
        /// <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)
 {
 }
Ejemplo n.º 22
0
 public OracleDbContextOptions(DbOptions dbOptions, DbModuleOptions options, ILoggerFactory loggerFactory, ILoginInfo loginInfo) : base(dbOptions, options, new OracleAdapter(dbOptions, options), loggerFactory, loginInfo)
 {
 }
Ejemplo n.º 23
0
 public OracleAdapter(DbOptions dbOptions, DbModuleOptions options) : base(dbOptions, options)
 {
 }
Ejemplo n.º 24
0
 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;
 }