我的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包。
答案 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= '';