MySqlException:数据对于第1行的列“ Id”太长

时间:2019-09-05 01:25:59

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

我的ASP.NET Core 2.2 /实体框架核心代码优先模型如下所示:

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

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

如果我执行常规的INSERT查询(“ INSERT INTO Books(Title)VALUES('Book Name');“),则没有问题,但是当我尝试在剃刀页面(支架)上添加记录时,错误:MySqlException:第1行的列'Id'的数据太长了。我想与[DatabaseGenerated(DatabaseGeneratedOption.Identity)]一起使用,我不必担心EF对插入的列进行任何操作。

为什么这不起作用?

编辑

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

1 个答案:

答案 0 :(得分: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= '';