【问题标题】:MySqlException: Data too long for column 'Id' at row 1MySqlException:第 1 行的“Id”列的数据太长
【发布时间】:2020-01-07 20:59:10
【问题描述】:

我的 ASP.NET Core 2.2 / Entity Framework 核心代码优先模型如下所示:

public class Book
{
    [Column("Id", TypeName = "varchar(8)")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }

    [Required, StringLength(100, MinimumLength = 1)]
    public string Title { get; set; }
}

我的 MySQL 触发器创建一个唯一的 8 字符 ID 如下所示:

CREATE DEFINER=`root`@`localhost` TRIGGER Books_BEFORE_INSERT BEFORE INSERT ON `Books` FOR EACH ROW
BEGIN
  DECLARE CNT INT DEFAULT 1;
  DECLARE UUID8 VARCHAR(8) DEFAULT null;

  WHILE CNT > 0 DO
    SET UUID8 = UPPER((SELECT LEFT(UUID(), 8)));
    SET CNT = (SELECT count(*) FROM Books WHERE Id = UUID8);

    IF CNT = 0 THEN
      SET new.Id := UUID8;
    END IF;
  END WHILE;
END

我在 Id 中添加了[StringLength(8, MinimumLength = 8)],希望 EF 将列保持在字符范围内,但它不起作用。

如果我执行常规 INSERT 查询 ("INSERT INTO Books (Title) VALUES ('Book Name');") 没有问题,但是当我尝试在我的剃须刀页面(脚手架)上添加记录时,我得到错误:MySqlException:第 1 行的“Id”列的数据太长。我认为 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 我不必担心 EF 在插入时对列做任何事情......?

为什么这不起作用?

编辑

我正在使用 Pomelo.EntityFrameworkCore.MySql NuGet 包。

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-mvc entity-framework-core


    【解决方案1】:

    将列类型更改为LONGTEXT

    public class Book
    {
        [Column("Id", TypeName = "LONGTEXT")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public string Id { get; set; }
    
        [Required, StringLength(100, MinimumLength = 1)]
        public string Title { get; set; }
    }
    

    或在您的 phpadmin 中运行此代码

    SET @@global.sql_mode= '';
    

    【讨论】:

    • 我已经尝试了 2 天。太感谢了。我会赞成你的回答,但这只是我在这里的第一篇文章,它不会让我这样做。
    猜你喜欢
    • 2020-03-04
    • 2018-12-01
    • 2014-02-26
    • 2017-01-17
    • 2018-10-19
    • 2022-11-26
    • 2016-06-07
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多