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?. 可空的字符串。

 

posted @ 2026-08-09 12:37  留下成长的足迹  阅读(3)  评论(0)    收藏  举报