EF中OnModelCreating配置HasMaxLength后超长字符串未报错问题咨询
EF Core HasMaxLength配置未生效的原因分析
你遇到的问题,核心原因有两个:
1. 数据库表结构未同步模型配置
你的代码中注释掉了a.Database.EnsureCreated();,如果目标数据库文件(Blogs.mdf)在此之前已经被创建,那么当时Url列的类型大概率是默认的nvarchar(max)(无长度限制)。
EF Core的HasMaxLength配置仅在首次创建表或通过迁移更新表结构时,才会将长度约束同步到数据库。你只修改了模型的OnModelCreating配置,但没有更新数据库的实际表结构,所以数据库里的Url列根本没有长度限制,自然能完整保存10位的字符串。
2. EF Core默认不执行客户端长度验证
EF Core本身不会自动针对HasMaxLength配置做客户端校验——也就是说在调用SaveChanges()之前,它不会检查字符串长度是否超出设定值。只有当数据库本身存在长度约束时,插入超长数据才会触发数据库的报错;如果数据库列没有限制,EF Core就直接将数据写入了。
解决方法
- 若数据库是首次创建:取消注释
a.Database.EnsureCreated();,让EF Core根据模型配置创建带长度约束的Url列; - 若数据库已存在:使用EF迁移更新表结构:
- 打开包管理器控制台,执行命令:
Add-Migration AddUrlMaxLength(生成迁移文件); - 执行命令:
Update-Database(将迁移应用到数据库);
- 打开包管理器控制台,执行命令:
- 如需客户端验证:给
Blog类的Url属性添加[StringLength(5)]数据注解,或者在调用SaveChanges()前手动校验字符串长度。
内容的提问来源于stack exchange,提问作者Han Han
相关产品推荐
相关产品推荐

