尝试使用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时,会生成错误。
答案 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);