c# - 如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?

标签 c# entity-framework .net-core entity-framework-core nullable-reference-types

我正在 .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 CS8618private 构造函数禁用 CS8616,但我认为这不是一个好主意。

在这种情况下应该如何使用 C# 8.0 可空引用类型? 还是我的模型是伪造的或违反了最佳实践 - 如何正确地做到这一点?

很遗憾,我没有找到相关的文档或指南。

最佳答案

没有正确的方法来处理不可为 null 的导航属性。

  1. 文档建议了两种方法,但都不是类型安全的。用一个 支持字段并抛出 InvalidOperationException。目前还不清楚如何 它不同于什么都不做并且有一个 NullReferenceException
  2. 用 null 宽容运算符抑制它

官方文档链接:https://learn.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization

关于c# - 如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171942/

相关文章:

c# - 如何将特征化文本转回 ML.NET 中的实际文本(用于聊天机器人)?

c# - Entity Framework ;如何处理foreach循环中的异常并不断迭代

docker - 从 Docker Windows 容器远程调试 .Net Core 控制台应用程序时,Visual Studio 2017 不加载调试符号

c# - .net core 是否支持代码契约?

c# - 从窗口类名获取窗口句柄

c# - 串口组合框

c# - 查询MySQL错误

c# - .Include() .Where() 在 Linq to Entities 查询中

entity-framework - EF 对象与泛型类型的比较

c# - IFormFile 作为嵌套的 ViewModel 属性