【发布时间】: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