【问题标题】:Entity Framework Core 2.2.1 DbQuery error system.Data.SqlTypes.SqlNullValueExceptionEntity Framework Core 2.2.1 DbQuery 错误 system.Data.SqlTypes.SqlNullValueException
【发布时间】:2023-03-07 14:39:02
【问题描述】:

尝试使用 DbQuery。我需要使用原始 sql 获取非实体类型 UserDetailDTO。将 DbQuery 添加到上下文并从控制器调用它。但它会生成 system.Data.SqlTypes.SqlNullValueException。

我的背景:

public class TrainingAppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbQuery<UserDetailDTO> UserDetailDTO { get; set; }

    public TrainingAppDbContext(DbContextOptions<TrainingAppDbContext> options)
    : base(options)
    {
        Database.EnsureCreated();
    }        
}

控制器:

public class AccountController : Controller
{
    private readonly TrainingAppDbContext ct;

    public AccountController(TrainingAppDbContext ct)
    {
        this.ct = ct;
    }

    public IActionResult Test()
    {
        var results = ct.UserDetailDTO.FromSql("SELECT * FROM users").ToList();
        return View();
    }
 }

当我从上下文调用我的 UserDetailDTO 时,它会生成一个错误。

error picture

【问题讨论】:

  • 无法给出具体答案,因为问题出在UserDetailDTO 类和/或SQL 查询的列中。您需要检查 SQL 查询是否允许某些未映射到 DTO 中可为空类型的列中的 NULL 值。
  • UserUserDetailDTO 的定义是什么?您在TrainingAppDbContext 中定义 dto 有什么原因吗?您应该只定义实体,然后通过自动映射器将实体映射到控制器中的 dto。

标签: asp.net entity-framework asp.net-core entity-framework-core


【解决方案1】:

仔细查看 UserDetailDTO 类和任何其他可能具有数据库中此表的外键的类。我们最近发现此错误是由添加到我们的实体中的 [Required] 数据注释引起的。在下面的示例中,FirstName 上方的 [Required] 属性是必需的,并且您的表中不应有该列为空的行。

namespace Entities
{
    public class UserDetailDTO
    {
        public int Id { get; set; }

        [Required]
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string PhoneNumber { get; set; }

        public string EmailAddress { get; set; }
    }
}

在早期版本的 EF Core 中,忽略了 [Required] 数据注释。 2.2.1 版开始在您的实体中查找这些注释并强制执行它们。几个月前,我们不知道这被错误地添加到我们的某些实体中,直到我们更新了 EF Core 版本并开始遇到此错误。由于在我们的案例中错误地添加了注释,因此删除注释解决了我们的问题。如果您发现这是您的问题的原因,并且您实际上希望该列是必需的,那么您的表中可能有该列为空的数据,这实际上是导致错误的原因。修复坏数据,使该列不为空,查询应该重新开始工作。

【讨论】:

    【解决方案2】:

    对于那些具有可以为空的字段(如 DateTime、任何枚举)的用户,如果您的查询为这些字段返回空值,请确保将其保留为可空字段。例如。

    public DateTime? DateOfBirth { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2019-04-03
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多