我正在 .NET Core 3.0 项目上启用 C# 8.0 可空引用类型。该项目使用 Entity Framework Core 3.0 访问数据库。
下面是一个Title不能为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;
}
}
自己的代码应该只使用 public
构造函数,而 private
构造函数只是为了允许 Entity Framework Core 和(也可能)序列化从数据库绑定(bind)值这些类/模型。公共(public)构造函数可能具有与模型具有的属性不同的结构、列表和参数类型(例如,它可能还包含第一个必需子项的参数,它可能有一些可选参数等)。
但是,编译器生成 CS8618 Non-nullable field is uninitialized。考虑在
。private
构造函数上声明为 nullable.
我可以通过 #pragma warning disable CS8618
为 private
构造函数禁用 CS8616,但我认为这不是一个好主意。
在这种情况下应该如何使用 C# 8.0 可空引用类型? 还是我的模型是伪造的或违反了最佳实践 - 如何正确地做到这一点?
很遗憾,我没有找到相关的文档或指南。
最佳答案
没有正确的方法来处理不可为 null 的导航属性。
- 文档建议了两种方法,但都不是类型安全的。用一个 支持字段并抛出 InvalidOperationException。目前还不清楚如何 它不同于什么都不做并且有一个 NullReferenceException
- 用 null 宽容运算符抑制它
关于c# - 如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171942/