博客 (28)

因 MySQL 8 默认使用 utf8mb4 字符集,如果是从 MySQL 5-7 等低版本迁移的,那么仍然是 utf8(相当于 utf8mb3)。

这在保存字符串时有可能会报错:

An error occurred while saving the entity changes. See the inner exception for details.

Incorrect string value: '\xF0\xA1\x90\x93\xE6\x9D...' for column 'Html' at row 1

即使连接字符串上加上 CharSet=utf8 或 CharSet=utf8mb3 或 CharSet=utf8mb4 也没用。

那么只能把数据库的字符集改为 utf8mb4。


更改字符集和排序方式前必须先备份数据库!


  1. 更改现有数据库的字符集和排序规则

    ALTER DATABASE mydatabase 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;
  2. 更改现有表的字符集和排序规则

    ALTER TABLE mytable 
    CONVERT TO CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;
  3. 更改现有列的字符集和排序规则

    当列单独设置了字符集时执行,未设置的不需要执行,会继承表的字符集

    ALTER TABLE mytable 
    MODIFY mycolumn VARCHAR(255) 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci


数据库中可能存在许多表,数据表中可能存在许多列,使用下面的命令可以生成批量执行的命令:

  1. 更改所有表的默认字符集和排序规则

    USE database_name; -- 替换为你的数据库名
    
    SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') 
    FROM information_schema.TABLES 
    WHERE TABLE_SCHEMA = 'database_name'; -- 再次替换为你的数据库名
  2. 更改所有列的字符集和排序规则

    USE database_name; -- 使用你的数据库名
    
    SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` MODIFY `', COLUMN_NAME, '` ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') 
    FROM information_schema.COLUMNS 
    WHERE TABLE_SCHEMA = 'database_name'; -- 使用你的数据库名


另外给出几条查询语句:

  1. 查看特定数据库的字符集和排序规则

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
    FROM information_schema.SCHEMATA
    WHERE SCHEMA_NAME = 'your_database_name';
  2. 查看特定表的字符集和排序规则

    SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'your_database_name';
  3. 查看特定列的字符集和排序规则

    SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
    FROM information_schema.COLUMNS 
    WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
xoyozo 7 个月前
1,469

.NET Framework 项目中使用 MySql.Data.EntityFramework 连接 MySQL 8.0 时遇到以下错误:

NotSupportedException: Character set 'utf8mb3' is not supported by .Net Framework.

解决方法:

Nuget 中将 MySql.Data 和 MySql.Data.EntityFramework 更新到最新版。

xoyozo 7 个月前
847
  1. 购买 ECS

  2. 解析域名(非网站域名)挂载磁盘(若有另购)、修改实例名称、主机名

  3. 设置阿里云(重要)

  4. 远程连接进入 ECS(若解析未生效可以先用 IP)(若新服默认使用 3389 端口,可先在安全组临时放行 3389 端口)

  5. 开启 Windows 防火墙(使用推荐设置)

  6. Windows 更新、并在高级选项中开启(更新 Windows 时接收其它 Microsoft 产品的更新)

  7. 安装 IIS:服务器管理器-添加角色和功能-勾选“Web 服务器(IIS)”包括管理工具

    建议勾选:

    默认已勾选项

    按需安装 IP 和域限制

    常见 HTTP 功能(不建议安装 WebDAV 发布

    跟踪(即“失败请求跟踪”)

    请求监视器、日志记录工具、

    按需安装 ASP

    按需安装 ASP.NET 4.8(会同时勾选 .NET Extensibility 4.8、ISAPI 扩展、ISAPI 筛选器)

    按需安装 WebSocket 协议

    应用程序初始化(建议安装)

    管理服务(用于 Web 部署)

  8. 细节:设置任务栏;设置桌面图标;个性化-颜色-勾选“标题栏和窗口边框”;设置输入法;

  9. 更改远程桌面端口

  10. 按需安装:

    下载 URL 重写(文件名:rewrite_amd64_zh-CN.msi)

    下载 MySQL Connector/NET(文件名:mysql-connector-net-8.0.19.msi)

    下载 ASP.NET Core 运行时 Hosting Bundle(文件名:dotnet-hosting-*.*.*-win.exe)

    下载 .NET 桌面运行时 Windows x64(文件名:windowsdesktop-runtime-*.*.*-win-x64.exe)

    下载 Web Deploy(文件名:WebDeploy_amd64_zh-CN.msi)

  11. 服务:设置“ASP.NET State Service”自动启动

  12. IIS 日志:路径(如 D:\wwwlogs),每小时(统一设置一个全局的就行了,不需要设置每个网站),按需勾选“使用本地时间进行文件命名和滚动更新”

  13. IIS 导入证书:个人、允许导出证书。

  14. 设置默认网站的 https

  15. 设置权限:设置网站所在分区(如 D 盘),安全,添加 IIS_IUSRS,全部拒绝(防止跨站)

  16. 添加用户:为每个网站创建用户(既能防止跨站,又能跟踪进程),密码不能改、不过期,仅隶属于 IIS_IUSRS,并添加到每个网站的根目录,若用户创建失败看这里

  17. 创建网站:设置访问物理路径的用户;设置应用程序池的“标识”用户;编辑绑定:勾选需要服务器名称指示;检查域名是否绑全;设置写入目录;

  18. 重复上面两步

  19. 检查所有网站用户是否仅隶属于 IIS_IUSRS(在“组”页面双击 Users 和 IIS_IUSRS 查看成员)

  20. 在应用程序池列表页面检查 CLR 版本、管托管道模式和标识;在网站列表页面检查绑定和路径

  21. 设置 Web 部署

  22. 设置“IP 地址和域限制”

  23. 废弃旧服时再次检查:IIS 中各功能设置、hosts、安装的应用程序、启动项、服务、防火墙等

  24. 更改默认端口

  25. 解析各网站域名

  26. 其它:资源管理器-查看-选项-查看-去掉“始终显示图标,从不显示缩略图”前的勾

  27. 再次检查阿里云设置

  28. 私网中若有 ECS 的 hosts 中域名直接绑定到私网 IP 的,做相应更改

  29. 在备份工具中添加该服务器的所有备份项


>> 关于域名解析

因各地域名解析生效时间不可控,一般国内域名 1 天内,国际域名 2 天内。

  • 若网站数据库在 RDS、上传文件在 OSS,则解析 48 小时后直接停止原网站即可;(比较理想的)

  • 文件上传到 ECS 的可使用 FTP 等工具定时同步文件,或直接停止原网站。(网友会遇到新文章中图片无法显示等问题)

  • 还有一种方法是新网站提前解析一个备用域名,确保完全生效后再修改正式域名的解析,原网站无条件跳转到备用域名,如果数据库中有保存完整网址路径的,关闭原网站并解绑备用域名之后,进行批量替换。(缺点是可能会影响在搜索引擎的网站权重)

  • 部分有定时器的网站要注意,如果两个网站的定时器都正常开启会导致意外的,需要停止其中一个网站的定时器。

当然每种方法都有优缺点,选择可以接受且方便的一种即可。


更多文章:

从零搭建一台阿里云 ECS(Alibaba Cloud Linux / CentOS / Linux)并迁移网站

xoyozo 1 年前
2,614

默认端口带来安全隐患,建议更改为 50000-60000 之间的端口号。


Windows 远程桌面(RDP)(3389)

  1. 在 Windows 防火墙中放行新端口:在“入站规则”中找到“Open RDP Port 3389”复制并粘贴该规则,修改端口和名称。

    若没有这个规则:新建规则 - 端口 - TCP - 特定本地端口(填写新的端口号)- 允许连接 - 名称

  2. 如有其它防火墙或安全组也一并配置(如阿里云 ECS 的安全组)

  3. 打开注册表(regedit),展开到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp,右侧双击“PortNumber”切换到“十进制”,将 3389 改为新端口号

  4. 重启生效

  5. 在防火墙和安全组中禁止原默认端口


SSH (22) 之 CentOS

  1. 从阿里云控制台登录服务器(如果未设置 root 密码则先设置),直接跳到第 4 步

  2. 在外部防火墙中放行新的端口号(如阿里云 ECS 的安全组)

  3. 在内部防火墙中放行新的端口号(如 firewalld 或 iptables),使用宝塔面板的直接在面板“安全”页面设置即可

  4. 打开 SSH 配置文件

    sudo vi /etc/ssh/sshd_config
  5. 找到并编辑 Port 行的商品号并启用

    #Port 22
  6. 重新加载使生效

    sudo systemctl reload sshd
  7. 在防火墙和安全组中禁止原默认端口

  8. 建议使用 SSH 密钥对代替传统账号密码登录


FTP (21) 之 FileZilla Server Windows 版

  1. 一般地,在 Windows Defender 防火墙中是以添加应用 filezilla-server.exe 的方式允许的,所以不需要更改端口。如果以端口方式允许的,那么在入站规则中允许新的端口。

  2. 如有其它防火墙或安全组也一并配置(如阿里云 ECS 的安全组)

  3. 打开 Administer FileZilla Server,打开菜单 - Server - Configure - Server listeners,右侧窗口中将 Port 改为新端口(强烈建议将 Protocol 改为“Require explicit FTP over TLS”,即禁止 FTP 协议,改为使用 FTPS 协议)

  4. 从防火墙和安全组移除 21 端口


FTP (21) 之 Pure-Ftpd(宝塔面板)

  1. 在防火墙中放行新的端口号(如阿里云 ECS 的安全组)

  2. 进入宝塔面板,打开“安全”,添加端口规则 TCP

  3. 在宝塔面板中进入软件商店,找到 Pure-Ftpd 并打开,切换到“配置修改”,搜索“Bind”,删除开头的“#”,将端口号 21 改为新端口号,保存(强烈建议将 TLS 项改为 2,即禁止 FTP 协议,仅允许 FTPS 协议)

  4. 切换到“服务”选项卡,点击“重启”

  5. 从防火墙和安全组移除 21 端口


MySQL (3306) 之阿里云云数据库 RDS MySQL 版

  1. 打开控制台 RDS 实例页,左侧菜单点击“白名单与安全组”,切换到“安全组”查看正在使用的安全组ID

  2. (若使用了安全组)打开控制台 ECS 首页,左侧菜单点击“安全组”,找到这个安全组,放行新的端口

  3. 打开控制台 RDS 实例页,左侧菜单点击“数据库连接”,点击“修改连接地址”,在弹出框中修改端口

  4. 从防火墙和安全组移除端口(确保没有其它实例正在使用此端口)


PolarDB (3306)

  1. 打开控制台 PolarDB 集群实例页,左侧菜单点击“集群白名单”,切换到“安全组”查看正在使用的安全组ID

  2. (若使用了安全组)打开控制台 ECS 首页,左侧菜单点击“安全组”,找到这个安全组,放行新的端口

  3. 打开控制台 PolarDB 集群实例,左侧菜单点击“基本信息”,点击“主地址”和“集群地址”的“配置”,在“网线信息”中点击“更多”更改端口

  4. 从防火墙和安全组移除端口(确保没有其它实例正在使用此端口)


MSSQL (1433) 之阿里云云数据库 RDS SQL Server 版

  1. 打开控制台 RDS 实例页,左侧菜单点击“白名单与安全组”,切换到“安全组”查看正在使用的安全组ID

  2. (若使用了安全组)打开控制台 ECS 首页,左侧菜单点击“安全组”,找到这个安全组,放行新的端口

  3. 打开控制台 RDS 实例页,左侧菜单点击“数据库连接”,点击“修改连接地址”,在弹出框中修改端口

  4. 从防火墙和安全组移除端口(确保没有其它实例正在使用此端口)


Redis (6379) 之阿里云云数据库 Redis 版

  1. 打开控制台 Redis 实例页,左侧菜单点击“白名单设置”,切换到“安全组”查看正在使用的安全组ID

  2. (若使用了安全组)打开控制台 ECS 首页,左侧菜单点击“安全组”,找到这个安全组,放行新的端口

  3. 打开控制台 Redis 实例页,在“连接信息”中点击“修改连接地址”,在弹出框中修改端口

  4. 从防火墙和安全组移除原端口(确保没有其它实例正在使用此端口)


宝塔面板 (8888)

  1. 在防火墙中放行新的端口号(如阿里云 ECS 的安全组),或直接在私网其它 ECS 上的浏览器上直接访问原 8888 端口的地址

  2. 进入宝塔面板,打开面板设置,切换到“安全设置”页,找到“面板端口”,点击“设置”

  3. 在防火墙和安全组中禁止原默认端口


IIS 管理服务(Web 部署)(8172)

  1. 在 Windows 防火墙中放行新端口:在“入站规则”中找到“Web 管理服务(HTTP 流量入站)”因其为预定义规则且复制也无法修改,所以按其设置新建一个,并指定新的端口。

  2. 如有其它防火墙或安全组也一并配置(如阿里云 ECS 的安全组)

  3. 打开 IIS 管理器 - 管理服务,右侧停止,左侧修改端口,右侧启动

  4. VS 中发布配置修改“服务器(E)”项添加端口

  5. 在防火墙和安全组中禁止原默认端口




xoyozo 1 年前
1,172

开发环境正常,发布到 IIS 报错

Could not load file or assembly 'Microsoft.EntityFrameworkCore.Relational, Version=6.0.x.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. 系统找不到指定的文件。

尝试在 UI 层安装 Pomelo.EntityFrameworkCore.MySql 无果。

最终,在发布时文件发布选项中,去掉“启用 ReadyToRun 编译”就正常了。

当然这种情况不是在所有启用了 ReadyToRun 编译的项目中遇到,但该项目改为不启用 ReadyToRun 后恢复正常了,原因暂时未知。

xoyozo 3 年前
2,410
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace xxx.xxx.xxx.Controllers
{
    public class DiscuzTinyintViewerController : Controller
    {
        public IActionResult Index()
        {
            using var context = new Data.xxx.xxxContext();

            var conn = context.Database.GetDbConnection();
            conn.Open();
            using var cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT `TABLE_NAME` FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE();";
            Dictionary<string, List<FieldType>?> tables = new();

            using var r = cmd.ExecuteReader();
            while (r.Read())
            {
                tables.Add((string)r["TABLE_NAME"], null);
            }
            conn.Close();

            foreach (var table in tables)
            {
                var conn2 = context.Database.GetDbConnection();
                conn2.Open();
                using var cmd2 = conn2.CreateCommand();
                cmd2.CommandText = "DESCRIBE " + table.Key;
                using var r2 = cmd2.ExecuteReader();
                List<FieldType> fields = new();
                while (r2.Read())
                {
                    if (((string)r2[1]).Contains("tinyint(1)"))
                    {
                        fields.Add(new()
                        {
                            Field = (string)r2[0],
                            Type = (string)r2[1],
                            Null = (string)r2[2],
                        });
                    }
                }
                conn2.Close();
                tables[table.Key] = fields;
            }

            foreach (var table in tables)
            {
                foreach (var f in table.Value)
                {
                    var conn3 = context.Database.GetDbConnection();
                    conn3.Open();
                    using var cmd3 = conn3.CreateCommand();
                    cmd3.CommandText = $"SELECT {f.Field} as F, COUNT({f.Field}) as C FROM {table.Key} GROUP BY {f.Field}";
                    using var r3 = cmd3.ExecuteReader();
                    List<FieldType.ValueCount> vs = new();
                    while (r3.Read())
                    {
                        vs.Add(new() { Value = Convert.ToString(r3["F"]), Count = Convert.ToInt32(r3["C"]) });
                    }
                    conn3.Close();
                    f.groupedValuesCount = vs;
                }
            }

            return Json(tables.Where(c => c.Value != null && c.Value.Count > 0));
        }

        private class FieldType
        {
            public string Field { get; set; }
            public string Type { get; set; }
            public string Null { get; set; }
            public List<ValueCount> groupedValuesCount { get; set; }
            public class ValueCount
            {
                public string Value { get; set; }
                public int Count { get; set; }
            }
            public string RecommendedType
            {
                get
                {
                    if (groupedValuesCount == null || groupedValuesCount.Count < 2)
                    {
                        return "无建议";
                    }
                    else if (groupedValuesCount.Count == 2 && groupedValuesCount.Any(c => c.Value == "0") && groupedValuesCount.Any(c => c.Value == "1"))
                    {
                        return "bool" + (Null == "YES" ? "?" : "");
                    }
                    else
                    {
                        return "sbyte" + (Null == "YES" ? "?" : "");
                    }
                }
            }
        }
    }
}
[{
	"key": "pre_forum_post",
	"value": [{
		"field": "first",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 1395501
		}, {
			"value": "1",
			"count": 179216
		}],
		"recommendedType": "bool"
	}, {
		"field": "invisible",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "-5",
			"count": 9457
		}, {
			"value": "-3",
			"count": 1412
		}, {
			"value": "-2",
			"count": 1122
		}, {
			"value": "-1",
			"count": 402415
		}, {
			"value": "0",
			"count": 1160308
		}, {
			"value": "1",
			"count": 3
		}],
		"recommendedType": "sbyte"
	}, {
		"field": "anonymous",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 1574690
		}, {
			"value": "1",
			"count": 27
		}],
		"recommendedType": "bool"
	}, {
		"field": "usesig",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 162487
		}, {
			"value": "1",
			"count": 1412230
		}],
		"recommendedType": "bool"
	}, {
		"field": "htmlon",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 1574622
		}, {
			"value": "1",
			"count": 95
		}],
		"recommendedType": "bool"
	}, {
		"field": "bbcodeoff",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "-1",
			"count": 935448
		}, {
			"value": "0",
			"count": 639229
		}, {
			"value": "1",
			"count": 40
		}],
		"recommendedType": "sbyte"
	}, {
		"field": "smileyoff",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "-1",
			"count": 1359482
		}, {
			"value": "0",
			"count": 215186
		}, {
			"value": "1",
			"count": 49
		}],
		"recommendedType": "sbyte"
	}, {
		"field": "parseurloff",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 1572844
		}, {
			"value": "1",
			"count": 1873
		}],
		"recommendedType": "bool"
	}, {
		"field": "attachment",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 1535635
		}, {
			"value": "1",
			"count": 2485
		}, {
			"value": "2",
			"count": 36597
		}],
		"recommendedType": "sbyte"
	}, {
		"field": "comment",
		"type": "tinyint(1)",
		"null": "NO",
		"groupedValuesCount": [{
			"value": "0",
			"count": 1569146
		}, {
			"value": "1",
			"count": 5571
		}],
		"recommendedType": "bool"
	}]
}]


xoyozo 3 年前
1,668

本文记录于 2021 年 9 月。



升级前期望(最新正式版)最终选择
操作系统CentOS 6.5Alibaba Cloud Linux 3Alibaba Cloud Linux 3
管理面板lnmp宝塔面板 Linux 版 7.7.0宝塔面板 Linux 版 7.7.0
Web 服务nginx 1.6nginx 1.21nginx 1.21
脚本语言PHP 5.6PHP 8.0PHP 7.4
数据库
RDS MySQL 5.6RDS MySQL 8.0RDS MySQL 5.6
论坛程序
Discuz! X3.2 GBKDiscuz! X3.5 UTF-8(即将发布)Discuz! X3.4 GBK


版本选择原因:

  • Alibaba Cloud Linux 完全兼容 CentOS,相比于 CentOS 较短的生命周期,Alibaba Cloud Linux 3 将于 2029 年 4 月 30 日结束生命周期。

  • Discuz! X3.4 不支持 PHP 8.0,安装时即报错,打开页面时一片空白。

  • MySQL 8.0 和阿里云 RDS 的 MySQL 7.5 不支持 MyISAM,而数据表 pre_common_member_grouppm 和 pre_forum_post 使用联合主键且自动递增字段不是第一主键,使用 InnoDB 引擎创建表时会报“1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key”错误,而擅自更改主键次序会影响业务逻辑。因此,在必须选择阿里云 RDS 的情况下,只能选择 MySQL 5.6。(2023年8月注:查看如何更改为 InnoDB

  • Discuz! X3.5 正式版尚未发布(截止发稿),即便发布,插件也可能不能得到及时更新。相比之下,X3.4 首个版本发布距今已有 4 年,相关第三方插件已经非常成熟。


完整升级步骤:

  1. 备份原网站程序、RDS 数据库;

  2. 购买新的 ECS、RDS,挂载磁盘,安装云监控;

  3. 迁移(或还原)数据库到新的 RDS;

  4. 安装宝塔面板并配置;

  5. 安装 nginx 及 PHP;

  6. 创建网站、配置 SSL、伪静态、防盗链、可写目录禁执行等(.conf);

  7. 配置 hosts;

  8. 上传原网站程序到新的站点目录下;

  9. Discuz! X 升级文档升级 X3.2 至 X3.4;详情见下文 ↓;

  10. 配置 OSS、Redis、更新缓存等;

  11. 测试论坛基本功能是否正常;检查附件是否正常显示;全面检查控制台配置;

  12. 逐个开启插件并检查兼容性;

  13. 按二开备忘录逐个按需进行二开;

  14. 逐个修改调用论坛接口的项目及直接调用论坛数据库的项目;

  15. 调试 MAGAPP 接口;

  16. 尝试强制 https 访问;

  17. 将以上所有修改后的程序保留备份;发布升级公告并关闭论坛;重复以上步骤;修改域名解析;开启论坛;

  18. 配置 IP 封禁、定时器、日志、自动备份、配置其它 ECS 的 hosts 等;

  19. 查看搜索引擎中收录的地址,是否有无法访问的情况;

  20. 尝试将历史遗留的本地附件全部转移到 OSS;

  21. 这篇文章,可能有其它需要配置的地方。


Discuz! X 升级步骤及注意点:

  • 升级前务必先修改 ./config/ 目录下的数据库/缓存连接信息,以防出现新站连接老库的情况;

  • 官方文档进行升级;

  • 【问题】运行到 ./install/update.php?step=data&op=notification 时白屏。

    【排查】尝试切换到 PHP 5.6 后成功(但该版本过于陈旧不能使用);尝试升级 CPU 和内存 PHP 7.4 上升级仍不成功。

    【原因】DB::result_first() 方法不对 SQL 语句追加“limit 1”,而是 SELECT 所有记录后在 PHP 端取第一条数据;

    【解决】打开文件 update.php,查找 elseif($_GET['op'] == 'notification'),该节点的功能是在表 home_notification 中查找 category <= 0 的数据并修复它,如果数据库中所有 category 都大于 0,直接注释其内部 if 代码段继续升级即可(或改为 if(false && ...))。

  • 【问题】发布主题遇到错误:(1062) Duplicate entry '*' for key 'pid'

    【原因】forum_post 中的 pid 不是自动增长的,而是由表 forum_post_tableid 中自动增长的 pid 生成的。如果生成的 pid 值已在 forum_post 表中存在,则会出现此错误。

    【解决】迁移数据库时应关闭论坛,以防止 forum_post 表有新数据插入。

  • 【问题】打开帖子页面 ./thread-***-1-1.html 显示 404 Not Found,而 ./forum.php?mod=viewthread&tid=*** 可以正常打开

    【原因】未配置伪静态(可在宝塔面板中选择)

  • 【问题】打开 UCenter 时报错:UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE name='noteexists'

    【解决】打开文件 ./uc_server/data/config.inc.php 配置数据库连接

  • 【问题】打开登录 UCenter 后一片空白

    【解决】将目录 ./uc_server/data/ 设为可写

  • 需要将原来安装的插件文件移回 ./source/plugin/ 目录,并设置可写;

  • 界面-表情管理,界面-编辑器设置-Discuz!代码


后续 Discuz! X3.4 R 小版本升级注意事项:

  1. 确认插件是否支持新版本(如短信通)

  2. 先创建一个新网站测试二开代码

  3. 保留 /config/、/data/、/uc_client/data/、/uc_server/data/、/source/plugin/,其它移入 old

  4. 上传文件

  5. 移回其它需要的文件,如:

  6. -- 勋章/loading/logo/nv 等:/static/image/common/

  7. -- 表情:/static/image/smiley/

  8. -- 水印:/static/image/common/watermark.*

  9. -- 风格:/template/default/style/t2/nv.png 等

  10. -- 默认头像:/uc_server/images/noavatar_***.gif

  11. -- 根目录 favicon.ico 等

  12. -- 及其它非 DZ 文件

  13. 再次检查可写目录的写入权限和禁止运行 PHP 效果。

xoyozo 3 年前
4,147

先上代码:

var db = new db_picContext();
var u = db.DtUser.Find(338);
int a = u.DtProject.Count();
int b = db.DtProject.Count(c => c.UploadUserId == u.Id);
return Json(new { a, b });

运行结果:

{"a":0,"b":2}

是不是说明 Find 结果 u 并不能通过导航属性(外键)来获取关联表的内容?

引擎:Pomelo.EntityFrameworkCore.MySql

xoyozo 4 年前
2,409

该问题将在 MySQL Connector/NET 8.0.24 中修复,参考:https://bugs.mysql.com/bug.php?id=102381

xoyozo 4 年前
2,484

您好,MySQL Connector/NET  社区,

从 8.0.23  版本开始,我们的  Entity Framework Core 提供程序有了一个新名称。主要目标是保持对 Microsoft Entity Framework Core 不同版本的支持,并确保这些版本与我们的发行版保持紧密联系。同样,此新命名在包装目的方面更为具体。因此,名称的“数据”部分已删除。

之前

    MySql.Data.EntityFrameworkCore v8.0.x

现在:

    MySql.EntityFrameworkCore v8.0.x

现在,Microsoft 维护的不仅是 Entity Framework Core 的单个版本,我们还需要找到一种方法来命名程序包并维护 Entity Framework Core 和 MySQL 版本之间的相关性。这就是我们想到使用软件包元数据的时候。软件包的版本现在由两部分组成,第一部分对应于当前支持的 Microsoft Entity Framework Core 版本,然后是一个“加号”,指示我们包含 MySQL 版本的元数据。

    MySql.EntityFrameworkCore v5.0.0+MySQL8.0.23
    MySql.EntityFrameworkCore v3.1.10+MySQL8.0.23

好吧,还有另外一种未来情况需要考虑。如果 Microsoft 没有为我们的较新的 Connector/NET 版本及时发布 Entity Framework Core 的新版本怎么办?假设当前受支持的 Entity Framework Core 版本是5.0.0,所以我们的软件包看起来像这样 MySql.EntityFrameworkCore 5.0.0+MySQL8.0.23,并且在我们发布下一个版本 8.0.24 时,Microsoft Entity Framework Core 的最新版本仍然是 5.0.0在这种情况下,我们将在版本中添加第四个数字,将包命名为:MySql.EntityFrameworkCore 5.0.0.1+MySQL8.0.23

我们希望您发现此新的命名模型有用且更精确。始终欢迎您提供反馈,您的所有意见都会激励我们不断改进,以便我们为您提供高品质的产品。

最后,以下是一些可能对您有用的链接:

我们希望能与您保持联系!


D
转自 Daniel Valdez 4 年前
2,412