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



尝试使用DbQuery。我需要使用原始sql获取非实体类型的UserDetailDTO。将DbQuery添加到上下文中,并从控制器调用它。但它是生成系统。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时,它会生成一个错误。

错误图片

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

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

public DateTime? DateOfBirth { get; set; }

相关内容

最新更新