c# - 使用前是否应检查 .NET EF Core DbContext 属性为 null

标签 c# asp.net asp.net-core .net-core entity-framework-core

已关注 this tutorial ,我得到的生成的 GetTodoItem(long id) 方法与示例中的方法不同。它包括对 _context.TodoItems 的空检查。现在,当编写我自己的 Controller 方法时,我想知道是否应该执行这些空检查。

请注意,TodoContext 属性不可为 null,但可以实例化为 null (= null!)。我目前使用的是 .NET 6,但想知道 .NET 8 的答案是否有所不同。请记住,我是 .NET 的新手。

public class TodoContext : DbContext {
    public TodoContext(DbContextOptions<TodoContext> options)
        : base(options)
    {}
    public DbSet<TodoItem> TodoItems { get; set; } = null!;
}

他们生成的代码

[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
    var todoItem = await _context.TodoItems.FindAsync(id);
    if (todoItem == null) {
        return NotFound();
    }
    return todoItem;
}

我生成的代码

[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
    if (_context.TodoItems == null) {
        return NotFound();
    }
    var todoItem = await _context.TodoItems.FindAsync(id);
    if (todoItem == null) {
        return NotFound();
    }
    return todoItem;
}

我遇到了两种不同的处理问题的方法。

最佳答案

Should one null check .NET EF Core DbContext properties before using

不,DbSet 属性由 EF Core 管理,如果它们由于某种原因将为 null - 发生了非常非常糟糕的事情,并且 null 检查将无济于事。

至于 Prop - 你有nullable reference types功能已启用,因此请查看 Working with Nullable Reference Types: DbContext and DbSet您可以将设置更改为:

public class TodoContext : DbContext {
    public TodoContext(DbContextOptions<TodoContext> options)
        : base(options)
    {}
    public DbSet<TodoItem> TodoItems => Set<TodoItem>();
}

所以= null!不会打扰眼睛。

关于c# - 使用前是否应检查 .NET EF Core DbContext 属性为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77521863/

相关文章:

c# - 如何使用 FromQuery Attribute 得到一个复杂的对象?

asp.net - 无点 url() 中的应用程序相对路径

asp.net-mvc - 使用 Jquery/Ajax 将模型传递到 Controller

javascript - 如何在表单提交后执行 Javascript

azure - Azure 应用服务上的 Asp.Net Core 2.2 TLS 1.2 支持

c# - ApiController 并不总是在 BadRequest 中返回数据

c# - 使用大量 block ?

c# - RestSharp 在 POST 上默认 Content-Type 为 application/x-www-form-urlencoded

C#确认消息框在拖放过程中卡住文件资源管理器

asp.net - 如何创建 ASP.NET 网站的移动版本?