System.InvalidCastException错误:Int32转String类型转换失败排查
问题排查与解决
错误根源
System.InvalidCastException: 无法将类型为“System.Int32”的对象强制转换为类型“System.String” 异常的核心原因是:数据库中Customer表的Age字段类型为整数(Int32),但实体类Customer中把Age定义成了string类型。当EF Core执行查询(db.Customers.FirstOrDefault(...))读取数据库数据时,会尝试把整数类型的字段值转换为字符串类型的实体属性,触发类型转换失败。
解决方案
根据业务需求选择以下两种修复方式:
方式一:调整实体类属性类型匹配数据库(推荐)
如果Age在业务逻辑中应该是数值类型(比如用于计算年龄),直接修改Customer实体的Age属性为整数类型,同步处理DTO的赋值逻辑:
- 修改
Customer实体类:
public partial class Customer { public int CustomerId { get; set; } public int? UserId { get; set; } public string? CustomerName { get; set; } // 将string改为int(若允许为空则用int?) public int Age { get; set; } public string Gender { get; set; } = null!; public string? ContactInfo { get; set; } public virtual ICollection<Order> Orders { get; set; } = new List<Order>(); public virtual User? User { get; set; } }
- 赋值DTO时将整数转为字符串(如果DTO需要字符串类型的Age):
UserCDTO cDTO = new UserCDTO { Username = user.Username, Address = user.Address, CustomerName = client.CustomerName, Age = client.Age.ToString(), // 把整数转为字符串 Gender = client.Gender, ContactInfo = client.ContactInfo, };
方式二:调整数据库字段类型匹配实体类
如果业务上Age必须是字符串类型(比如存储带单位的年龄,如"25岁"),则修改数据库中Customer表的Age字段类型为varchar或nvarchar,确保和实体类的string类型一致。
额外检查
如果使用EF Core Fluent API做了自定义映射,需确认映射配置的字段类型和实体属性、数据库字段一致:
// 示例:确保Age字段映射为int类型 modelBuilder.Entity<Customer>() .Property(c => c.Age) .HasColumnType("int");
内容的提问来源于stack exchange,提问作者harel cohen
相关产品推荐
相关产品推荐

