SQL Server使用Fluent API设置字符串默认值报错如何解决
报错原因
触发这个错误的核心原因是配置默认值前没有显式指定字段的映射类型:EF Core默认会将C#中的string类型映射为数据库端的Unicode类型nvarchar,而你实际的字段是varchar(180)非Unicode类型,类型映射不匹配时,EF Core生成的默认值约束SQL会把传入的字符串值误识别为列名,刚好命中SQL Server的语法限制抛出错误。另外你代码里写的默认文件名存在拼写笔误,注意和实际的默认资源文件名保持一致。
正确配置方案
在Fluent API配置中先明确列的映射规则,再设置默认值即可:
builder.Property(a => a.ImagePath) .IsUnicode(false) // 标记为非Unicode类型,对应数据库varchar类型 .HasMaxLength(180) // 指定字段长度,匹配设计的varchar(180)字段规则 .HasDefaultValue("Default.png"); // 配置默认值,注意修正文件名拼写
如果执行迁移时还是出现同类报错,可以换用直接传入SQL表达式的方法配置,兼容性更好:
builder.Property(a => a.ImagePath) .IsUnicode(false) .HasMaxLength(180) .HasDefaultValueSql("'Default.png'"); // SQL语法中字符串常量需要用单引号包裹
可选替代方案
如果你不想修改数据库结构,也可以直接在实体类的构造函数中给属性赋初始值,在应用层实现默认值逻辑,同样能满足未上传图片时自动使用默认图的需求:
public class YourEntity { // 其他实体属性省略 public string ImagePath { get; set; } public YourEntity() { ImagePath = "Default.png"; } }
注意:如果是已经存在的存量表,修改完EF Core的配置后,需要生成并执行数据库迁移,才能将默认值约束同步更新到数据库表结构中。
内容的提问来源于stack exchange,提问作者MSoheil
相关产品推荐
相关产品推荐

