c# - 我如何提示 C# 8.0 可空引用系统使用反射初始化属性

标签 c# entity-framework entity-framework-core c#-8.0 nullable-reference-types

当我尝试在 C# 8.0 中将 Entity Framework Core 与新的可空引用类型一起使用时,我遇到了一个有趣的问题。

Entity Framework (各种风格)允许我声明我从未初始化的 DBSet 属性。例如:

    public class ApplicationDbContext : IdentityDbContext
      {
    #pragma warning disable nullable
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
          : base(options)
        { }
    #pragma warning restore nullable

        public DbSet<Probe> Probes { get; set; }
        public DbSet<ProbeUnitTest> ProbeUnitTests { get; set; }
    }

DbContext 构造函数反射(reflect)类型并初始化所有 DbSet 属性,因此我知道构造函数结束时所有属性都将是非空的。如果我省略 #pragma,我会收到预期的警告,因为我的代码不会初始化这些属性。

 Data\ApplicationDbContext.cs(10,12,10,32): warning CS8618: Non-nullable property 'Probes' is uninitialized.
 Data\ApplicationDbContext.cs(10,12,10,32): warning CS8618: Non-nullable property 'ProbeUnitTests' is uninitialized.

当我只想通知编译器某个属性不会为 null 时,关闭警告似乎是一种生硬的工具?

如果事实证明我可以像这样欺骗编译器:

     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
      : base(options)
    {
      Probes = Probes;
      ProbeUnitTests = ProbeUnitTests;
    }

这段代码的优点是它非常狭窄——它只适用于特定属性的初始化,不会抑制其他警告。缺点是这是无意义的代码,因为将属性分配给自身实际上应该什么都不做。

是否有一个首选的习惯用法来通知编译器它只是不知道该属性已被初始化?

最佳答案

每当您想告诉编译器关于可空引用类型“闭嘴,我知道我在做什么”时,请使用 ! 运算符。您可以像这样声明您的属性来解决您的问题:

public DbSet<Probe> Probes { get; set; } = null!;
public DbSet<ProbeUnitTest> ProbeUnitTests { get; set; } = null!;

关于c# - 我如何提示 C# 8.0 可空引用系统使用反射初始化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57342964/

相关文章:

c# - Linq to Entities 查询无法执行

sqlite - 向现有 SQLite 表添加约束

c# - 将 DBSet 集合作为 bson 文档插入到 Mongodb

c# - 如何使用 IHttpActionResult 对 Created-201 响应进行编码

c# - 在标签上显示首选 DNS 和备用 DNS

c# - 违反唯一索引,试图在新上下文中插入对象图

c# - native Entity Framework 事务行为

c# - 如何从字典中删除所有元素?

c# - 光标在模板化文本框中不闪烁

c# - Entity Framework 核心插入无需变更跟踪