.NET 2.0迁移中nvarchar映射报错问题求解决方案
我之前维护旧版本.NET Core项目时也碰到过一模一样的问题——明明按提示加了HasMaxLength()或者HasColumnType(),但EF就是不生成正确的nvarchar列。既然你们没法升级到2.1,试试下面这几个经过验证的解决方案:
改用
nvarchar(长度)作为列类型参数
你之前写的HasColumnType("string(10)")在2.1之前的EF Core版本里不被识别,框架没法把它映射到SQL Server的nvarchar类型。直接换成明确的数据库原生类型写法:modelBuilder.Entity<YourEntity>() .Property(e => e.YourStringProp) .HasColumnType("nvarchar(50)"); // 替换成你需要的长度这个写法在旧版本里稳定生效,因为直接指定了数据库能识别的列类型。
结合
HasMaxLength()和HasColumnType()的完整配置链
有时候单独用HasMaxLength()会被全局配置或默认规则覆盖,把两个方法结合起来,明确告诉EF既要限制长度,也要用nvarchar类型:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<YourEntity>() .Property(e => e.YourStringProp) .HasMaxLength(100) .HasColumnType("nvarchar") .IsRequired(false); // 根据业务需求选填是否必填 }注意要把这个配置放在
OnModelCreating方法里,确保EF构建模型时优先读取这个配置。使用数据注解替代Fluent API
如果Fluent API的配置总是不生效,试试用数据注解直接标记实体属性,旧版本EF对数据注解的解析反而更稳定:public class YourEntity { // 同时指定列类型和长度 [Column(TypeName = "nvarchar(50)")] [StringLength(50)] public string YourStringProp { get; set; } }记得要确保项目引用了
System.ComponentModel.DataAnnotations包,旧版本里这个包需要单独引入。检查全局配置是否冲突
看看你的OnModelCreating里有没有全局设置字符串默认类型的代码,比如:modelBuilder.Properties<string>() .HasColumnType("varchar");如果有这种全局配置,会覆盖单个属性的设置,这时候需要针对特定属性单独重写:
modelBuilder.Entity<YourEntity>() .Property(e => e.YourStringProp) .HasColumnType("nvarchar(50)") .HasMaxLength(50);
最后还有个小提醒:每次修改配置后,记得重新生成迁移文件,查看生成的SQL语句里列类型是不是正确的nvarchar(长度)——有时候配置生效了,但迁移没更新,导致数据库还是旧的列类型。
内容的提问来源于stack exchange,提问作者Monofuse

