当我尝试将Entity Framework Core与C#8.0中的新可为空的引用类型一起使用时,遇到了一个有趣的问题。
实体框架(各种样式)允许我声明我从未初始化过的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; }
}
Run Code Online (Sandbox Code Playgroud)
DbContext构造函数反映类型并初始化所有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.
Run Code Online (Sandbox Code Playgroud)
当我只想通知编译器某个属性不会为null时,关闭警告似乎是一种钝器。
如果事实证明,我可以像这样愚弄编译器:
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.
Run Code Online (Sandbox Code Playgroud)
该代码的优点是范围很窄-仅适用于特定属性的初始化,不会抑制其他警告。缺点是这是胡扯的代码,因为为其本身分配属性实际上不应该执行任何操作。
是否有首选的惯用法通知编译器它只是不知道该属性已被初始化?
c# entity-framework entity-framework-core c#-8.0 nullable-reference-types