MySQL CodeFirst BackupTable 在特定字段类型下异常备份 返回

SqlSugar 沟通中
3 510
该叫什么 itben 发布于2026/2/5
悬赏:0 飞吻

## 问题描述

使用 SqlSugar 的 CodeFirst 模式时,`BackupTable().InitTables()` 在 MySQL 数据库中存在严重的逻辑不一致问题:


1. **当实体包含特定字段类型时**:即使实体结构未变化,每次运行都会创建备份表

2. **当实体不包含这些类型时**:即使实体结构未变化,不会创建备份表

3. **在 SQLite 数据库中**:行为正常,不会出现异常备份


**核心矛盾1**`GetDifferenceTables()` 结果提示"No change"  但却仍然创建了备份表

**核心矛盾2**`BackupTable()` 的行为定义不明确且不一致,无论其预期行为是"备份所有表"还是"仅备份变化的表",当前实现都存在问题。


## 环境信息


- **数据库**: MySQL 8.4.5 Ubuntu 24.04 LTS

- **对比数据库**: SQLite(正常)

- **SqlSugar 版本**: 5.1.4.211

- **框架**: .NET 10


## 🔬 精确触发条件(已验证)


### 条件 1: 字段长度超过 4000

```csharp

// ✅ 正常 - 不会每次备份

[SugarColumn(ColumnName = "Content", Length = 4000)]

public string Content { get; set; }


// ❌ 异常 - 每次都会备份

[SugarColumn(ColumnName = "Content", Length = 4001)]

public string Content { get; set; }

```

**临界点**: `Length = 4000` 正常,`Length = 4001` 及以上异常


### 条件 2: IsJson = true

```csharp

// ❌ 异常 - 每次都会备份

[SugarColumn(IsJson = true)]

public Dictionary<string, string> JsonData { get; set; }


// ❌ 异常 - 每次都会备份

[SugarColumn(IsJson = true)]

public object JsonField { get; set; }

```

**所有 `IsJson = true` 的字段都会触发此问题**


## 完整复现步骤


### 步骤 1: 创建测试实体


```csharp

// 场景 A: 包含问题字段(会异常备份)

public class ProblematicEntity

{

    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]

    public int Id { get; set; }


    [SugarColumn(Length = 4001)]  // 触发点 1

    public string LongText { get; set; }


    [SugarColumn(IsJson = true)]  // 触发点 2

    public Dictionary<string, string> JsonData { get; set; }

}


// 场景 B: 不包含问题字段(不会异常备份)

public class NormalEntity

{

    [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]

    public int Id { get; set; }


    [SugarColumn(Length = 4000)]  // 安全长度

    public string Content { get; set; }


    [SugarColumn(Length = 100)]

    public string Name { get; set; }

}

```

### 步骤 2: 执行 CodeFirst

省略

### 步骤 3: 观察结果


#### 场景 A (ProblematicEntity):

```

第 1 次运行: CREATE TABLE ProblematicEntity

第 2 次运行: CREATE TABLE ProblematicEntity20260205164653  ← 备份表

第 3 次运行: CREATE TABLE ProblematicEntity20260205164727  ← 又一个备份表

第 N 次运行: 持续创建备份表...

```

#### 场景 B (NormalEntity):

```

第 1 次运行: CREATE TABLE NormalEntity

第 2 次运行: 无操作 ✅

第 3 次运行: 无操作 ✅

第 N 次运行: 无操作 ✅

```

**关键**: 两个场景的实体在多次运行期间**都没有任何代码变化**


## 💥 逻辑矛盾分析


### BackupTable() 的预期行为应该是什么?


#### 假设 1: "备份所有表"

如果 `BackupTable()` 的定义是每次都备份所有表:


**问题**: 为什么场景 B (NormalEntity) 不创建备份表?

- 预期:每次都应创建备份

- 实际:不创建备份

- **结论:行为不符合假设**


#### 假设 2: "仅备份变化的表"

如果 `BackupTable()` 的定义是仅在检测到变化时备份:


**问题**: 为什么场景 A (ProblematicEntity) 在未变化时创建备份?

- 预期:未变化时不应备份

- 实际:每次都备份

- **结论:行为不符合假设**


热忱回答3

  • BackupTable()  这个方法是每次都会备份。

    0 回复
  • 基本不怎么推荐用这个方法。

    0 回复
  • itben itben VIP0
    2026/3/3

    @fate sta:如果每次都备份,是备份全部表还是仅备份变化的表,为什么又会出现一会儿备份一会儿不备份的情况


    0 回复