实体框架核心2.2.1 DbQuery错误system.Data.SqlTypes.SqlNullValueException

时间:2019-01-16 09:45:52

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

尝试使用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

2 个答案:

答案 0 :(得分:0)

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

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版本并开始遇到此错误。由于在我们的案例中错误地添加了注释,因此删除注释解决了我们的问题。如果您发现这是导致问题的原因,并且您实际上想要该列是必需的,则您的表中可能有数据,其中该列为null,这实际上是导致该错误的原因。修复该错误数据,使该列不为空,然后查询应重新开始工作。

答案 1 :(得分:0)

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

void *handle = dlopen("./libplayao.so", RTLD_LAZY | RTLD_GLOBAL);