Esempio n. 1
0
 /// <summary>
 /// 数据库链接字符串
 /// </summary>
 /// <param name="options"></param>
 /// <returns></returns>
 static public string ConnectionString(this DBConnectionOptions options)
 {
     if (options.ServerAddress.EndsWith("/") || options.Database.StartsWith("/"))
     {
         return(options.ServerAddress + options.Database);
     }
     return(options.ServerAddress + "/" + options.Database);
 }
        /// <summary>
        /// 初始化数据库的连接
        /// </summary>
        public static void SetConnection()
        {
            // 创建数据库连接信息
            if (Connection == null)
            {
                Connection = new DBConnection(DBType.MongoDB, OnChange);
            }
            if (Connection.ConnectionList.Count == 0)
            {
                ApiException.ThrowBadRequest("请填写数据库的连接配置");
            }

            // 为每个数据库连接创建数据库服务
            Dictionary <string, MongoProvider> ConnDict = new Dictionary <string, MongoProvider>();

            foreach (var conn in Connection.ConnectionList)
            {
                conn.Name     = conn.Name.ToLower();
                LoggerConnect = conn;
                if (string.IsNullOrWhiteSpace(conn.Name))
                {
                    ApiException.ThrowBadRequest("请为连接数据库的字符串指定名称");
                }
                if (ConnDict.ContainsKey(conn.Name))
                {
                    continue;
                }
                try
                {
                    // 获取数据链接客户端
                    IMongoClient MongoClient = new MongoClient(conn.ConnectionString());
                    // 获取数据库
                    IMongoDatabase MongoDatabase = MongoClient.GetDatabase(conn.Database);
                    ConnDict.Add(conn.Name, new MongoProvider {
                        Client = MongoClient, Database = MongoDatabase, Connection = conn
                    });
                }
                catch (Exception ex)
                {
                    // 由于数据库连接字符串容易被外界改变,所以只针对连接字符串出错时记录日志并发送邮件。其它错误应该在测试阶段发现。
                    DBLog.Logger.Error(ex, "连接MongoDB数据库失败", Connection.ConnectionList);
                    throw new Exception("连接数据库失败,请检查数据库连接字符串");
                }
            }

            // 根据持久化操作对象的特性创建数据库操作服务
            ProviderDict.Clear();
            foreach (var map in LoadMapping())
            {
                if (ProviderDict.ContainsKey(map.DALTypeName))
                {
                    continue;
                }

                if (!ConnDict.ContainsKey(map.ConnectionName))
                {
                    ApiException.ThrowBadRequest($"Mongo数据库{map.ConnectionName}连接信息不存在,请检查配置项");
                }
                var db = ConnDict[map.ConnectionName];
                ProviderDict.Add(map.DALTypeName, new MongoProvider
                {
                    Name           = map.DALTypeName,
                    Client         = db.Client,
                    Database       = db.Database,
                    Connection     = db.Connection,
                    CollectionName = map.CollectionName,
                    Collection     = db.Database.GetType().GetMethod("GetCollection").MakeGenericMethod(map.ModelType).Invoke(db.Database, new object[] { map.CollectionName, null })
                });
            }
        }