EF Core查询时出现System.Guid无法转换为System.String错误如何解决
问题根因
1. 父类Entity的主键未正确定义为属性
你当前Entity类中的Id是字段(public Guid Id;),而非C#公共属性。EF Core默认只会映射公共读写属性,不会自动识别字段作为映射对象,这就导致EF无法将Id识别为主键,在读取数据库表中Id列(类型为uniqueidentifier对应C# Guid)时,会错误尝试将该列映射到实体中的字符串类型属性,触发类型转换报错。
2. 潜在映射不匹配问题
如果修复上述问题后仍报错,可确认两个点:
- 数据库
DocumentationPages表的UserId列是否设为了uniqueidentifier类型,但实体中UserId定义为string,导致EF读取该列时尝试将Guid转为string - 是否存在自定义实体映射配置,错误绑定了Guid类型列和字符串属性的对应关系
解决方案
第一步:修复Entity类的Id定义
将Id改为公共属性,EF会默认识别名为Id的属性为主键:
public class Entity { public Guid Id { get; set; } }
第二步:显式标记主键(可选但推荐)
可添加[Key]注解明确标记主键,避免EF映射歧义:
using System.ComponentModel.DataAnnotations; public class Entity { [Key] public Guid Id { get; set; } }
第三步:校验数据库列类型
核对DocumentationPages表的列类型:
Id列必须为uniqueidentifier类型,和C# Guid对应- 如果
UserId在数据库中存的是Guid格式,要么将实体UserId改为Guid类型,要么将数据库UserId列改为varchar/nvarchar类型存储Guid字符串,保持两边类型一致
第四步:修正异步查询写法
你当前的GetByIdAsync方法使用了同步的FirstOrDefault,不符合异步方法定义,改为EF原生异步方法:
public async Task<DocumentationPage> GetByIdAsync(Guid id) { return await context.DocumentationPages.FirstOrDefaultAsync(c => c.Id == id); }
内容的提问来源于stack exchange,提问作者Rowin
相关产品推荐
相关产品推荐

