如何在实体框架核心模型中使用C#8.0可空引用类型?


16

我在.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;
    }
 }

public仅当private构造函数仅用于实体框架核心和(可能还)序列化将数据库中的值绑定到这些类/模型时,才应使用自己的代码。公共构造函数的参数结构,列表和类型可能与模型具有的属性不同(例如,它可能还包含第一个必需子级的参数,它可能具有一些可选参数等)。

但是,编译器会CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.private构造函数上生成。

我可以通过private构造器禁用CS8616,#pragma warning disable CS8618但我认为这不是一个好主意。

在这种情况下应该如何使用C#8.0可空引用类型?还是我的模型虚假或违反了最佳做法-如何正确执行?

不幸的是,我没有找到相关的文档或指南。


Answers:


6

没有适当的方法来处理不可为空的导航属性。

  1. 文档提出了两种方法,但两种方法都不安全。使用备用字段并引发InvalidOperationException。目前尚不清楚它与不执行操作有什么区别并具有NullReferenceException
  2. 用null原谅运算符抑制它

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


2

MS Docs获取具有构造函数的实体类型

当EF Core创建这些类型的实例(例如查询结果)时,它将首先调用默认的无参数构造函数,然后将每个属性设置为数据库中的值。但是,如果EF Core找到参数名称和类型与映射属性匹配的参数化构造函数,则它将使用这些属性的值调用该参数化构造函数,并且不会显式设置每个属性。

也许值得用那些属性所需的参数创建一个私有ctor,然后看看Framework是否会调用它并起作用?

除非您完全100%确信可以禁用警告,否则禁用警告也不是一个好主意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.