【发布时间】:2020-01-29 23:41:52
【问题描述】:
我在 .NET Core 3.0 项目上启用 C# 8.0 Nullable Reference Types。项目使用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 和(可能还有)序列化将值从数据库绑定到这些类/模型。公共构造函数可能具有与模型具有的属性不同的结构、列表和参数类型(例如,它可能还包含第一个必需子项的参数,它可能具有一些可选参数等)。
但是,编译器会在 private 构造函数上生成 CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.。
我可以通过 #pragma warning disable CS8618 为 private 构造函数禁用 CS8616,但我认为这不是一个好主意。
在这种情况下应该如何使用 C# 8.0 可空引用类型? 还是我的模型是伪造的或违反了最佳实践 - 如何正确执行?
很遗憾,我没有找到相关的文档或指南。
【问题讨论】:
标签: c# entity-framework .net-core entity-framework-core nullable-reference-types