ali*_*lik 10 c# entity-framework entity-framework-core .net-core nullable-reference-types
我在.NET Core 3.0项目上启用C#8.0可空引用类型。该项目使用Entity Framework Core 3.0访问数据库。
以下是标题不应该为null的数据模型。
public class Vehicle
{
public int Id { get; private set; }
public string Title { get; private set; }
// Entity Framework Core is instructed to bind to the private _drivers field in a configuration builder
private readonly List<Driver> _drivers = new List<Driver>();
public IReadOnlyCollection<Driver> Drivers => _drivers.AsReadOnly();
private Vehicle()
{
}
public Vehicle(string title)
{
this.Title = title;
}
public void AddDriver(string name)
{
this._drivers.Add(new Driver(name));
}
}
// A foreign column is defined in a configuration builder
public class Driver
{
public int Id { get; private set; }
public string Name { get; private set; }
private Driver()
{
}
public Driver(string name)
{
this.Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
public仅当private构造函数仅用于实体框架核心和(可能还)序列化将数据库中的值绑定到这些类/模型时,才应使用自己的代码。公共构造函数的参数结构,列表和类型可能与模型具有的属性不同(例如,它可能还包含第一个必需子级的参数,它可能具有一些可选参数等)。
但是,编译器会CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.在private构造函数上生成。
我可以通过private构造函数禁用CS8616,#pragma warning disable CS8618但我认为这不是一个好主意。
在这种情况下应该如何使用C#8.0可空引用类型?还是我的模型虚假或违反了最佳做法-如何正确执行?
不幸的是,我没有找到相关的文档或指南。
Mik*_*lev 10
没有正确的方法来处理不可为空的导航属性。
官方文档链接:https : //docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization
joe*_*dev 10
我同意你的观点——编译指示块很难看。相反,我会将 null 宽恕运算符分配给默认构造函数内的不可为 null 的引用类型,如下所示:
private Vehicle()
{
Title = null!;
}
Run Code Online (Sandbox Code Playgroud)
这比使用所述内联运算符初始化属性要干净得多,也更具表现力,如下所示:
public string Title { get; private set; } = null!;
Run Code Online (Sandbox Code Playgroud)
后一个解决方案读作“Title无论场景如何,我都知道不为空”,这实际上否定了不可为空引用类型的好处,因为您丢失了所有设计时检查。前者读作“我知道在这种特定Title情况下不为空”,因此如果您错过了分配,编译器警告将继续在其他地方发出。
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |