ASP.NET Core应用打开Products Index页面时遇InvalidCastException错误求助
解决ASP.NET Core中InvalidCastException:Int32转String失败的问题
问题现象
运行ASP.NET Core应用并打开Products Index页面时,持续抛出以下错误:
InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'. Microsoft.Data.SqlClient.SqlBuffer.get_String() Microsoft.Data.SqlClient.SqlDataReader.GetString(int i) lambda_method(Closure , QueryContext , DbDataReader , ResultContext , int[] , ResultCoordinator ) Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable<T>+AsyncEnumerator.MoveNextAsync() Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync<TSource>(IQueryable<TSource> source, CancellationToken cancellationToken) Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync<TSource>(IQueryable<TSource> source, CancellationToken cancellationToken) ControleEstoque.Controllers.ProductsController.Index() in ProductsController.cs + List<Product> model = await _context.Products.ToListAsync(); ...(省略后续调用栈)
根因分析
Product实体类中ProviderId属性被声明为string类型,但数据库对应Products表的ProviderId列实际为int类型。EF Core读取数据时,尝试将整数类型的值强制转换为字符串,触发类型转换异常。
解决方案
根据业务需求选择以下任一修复方式:
方案1:修改实体类ProviderId为int类型(推荐,若ProviderId为关联主键)
如果ProviderId本质是整数(例如关联供应商表的主键ID),直接调整Product实体类的属性类型:
namespace ControleEstoque.Models { [Table("Products")] public class Product { [Key] public int Id { get; set; } [Required(ErrorMessage ="Obrigatório informar nome")] public string Name { get; set; } [Required(ErrorMessage = "Obrigatório informar Descrição")] public string Description { get; set; } [Required(ErrorMessage = "Obrigatório informar Id do Fornecedor")] public int ProviderId { get; set; } // 改为int类型 } }
修改后,确保控制器中涉及ProviderId的操作保持一致(例如Edit方法若需更新该字段,需在Bind参数中添加ProviderId)。
方案2:修改数据库列类型为字符串类型
若业务上ProviderId必须为字符串,需修改数据库Products表的ProviderId列类型为varchar或nvarchar,与实体类的string类型匹配。
验证
修改完成后重新运行应用,访问Products Index页面,确认错误消失,数据正常加载。
内容的提问来源于stack exchange,提问作者Gabriel M Xavier
相关产品推荐
相关产品推荐

