EF Core获取不到数据的问题(字段为null类型,实体类一定要一致)
之前为UserInfo表,加了两个可为null的 nvarchar(100)的字符串类型的字段,C#的实体类也加上了对应的字段,为string类型。发现EF Core取不到数据了
排查了3个小时,终于把原因找到了,记录一下,防止以后还踩坑。
SQLserver表
CREATE TABLE [dbo].[UserInfo]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [CompanyId] [int] NOT NULL, [CreatedAt] [datetime] NULL, [UpdateAt] [datetime] NULL, [CreatedBy] [nvarchar](100) NULL, [UpdateBy] [nvarchar](100) NULL, [LogInName] [nvarchar](100) NULL, [PassWord] [nvarchar](100) NULL ) ON [PRIMARY]
对应C#代码的实体类
[Table("UserInfo")] public class UserInfo { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Name { get; set; } public int CompanyId { get; set; } public DateTime? CreatedAt { get; set; } public DateTime? UpdateAt { get; set; } public string? CreatedBy { get; set; } public string? UpdateBy { get; set; } public string LogInName { get; set; } public string PassWord { get; set; } }
其中LogInName 和PassWord 类型是string, 单数数据是 nvarchar(100) null,可为空。
结果通过Ef Core获取不到数据。
var users = _commonDbContext.UserInfo.Where(i => i.Id == 1);
通过生成的sql,在数据库中直接执行,是可以获取到数据的
var sql = users.ToQueryString(); // 查看生成的 SQL
--生成的sql
SELECT [u].[Id], [u].[CompanyId], [u].[CreatedAt], [u].[CreatedBy], [u].[LogInName], [u].[Name], [u].[PassWord], [u].[UpdateAt], [u].[UpdateBy]
FROM [UserInfo] AS [u]
WHERE [u].[Id] = 1
如果 PassWord 字段在数据库中允许 NULL,但实体类定义为 string PassWord(非可空),当数据库中有 NULL 值时,EF Core 会抛出异常或静默失败
原因就是应该把LogInName 和PassWord 的类型,写成是string?. 可空的字符串。
浙公网安备 33010602011771号