¿Cómo usar los tipos de referencia anulables C # 8.0 con los modelos de Entity Framework Core?

16

Estoy habilitando los tipos de referencia anulables C # 8.0 en un proyecto .NET Core 3.0. El proyecto utiliza Entity Framework Core 3.0 para acceder a la base de datos.

El siguiente es un modelo de datos cuyo título no debe ser nulo.

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;
    }
 }

Se supone que el código propio usa los publicconstructores solo mientras los privateconstructores están ahí solo para permitir que Entity Framework Core y (potencialmente también) la serialización unan valores de la base de datos a estas clases / modelos. El constructor público puede tener una estructura, una lista y tipos de argumentos diferentes de las propiedades que tiene el modelo (por ejemplo, también puede contener argumentos para el primer hijo requerido, puede tener algunos argumentos opcionales, etc.).

Sin embargo, el compilador genera CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.en los privateconstructores.

Puedo deshabilitar CS8616 para los privateconstructores #pragma warning disable CS8618pero no lo considero una buena idea.

¿Cómo se supone que debe usar los tipos de referencia anulables C # 8.0 en este escenario? ¿O mi modelo es falso o viola las mejores prácticas? ¿Cómo hacerlo correctamente?

Desafortunadamente, he encontrado documentos u orientación no relevantes.

alik
fuente

Respuestas:

6

No hay una forma adecuada de manejar las propiedades de navegación no anulables.

  1. La documentación sugiere dos formas y ambas no son de tipo seguro. Use un campo de respaldo y arroje InvalidOperationException. No está claro cómo difiere de no hacer nada y tiene una NullReferenceException
  2. Suprímalo con un operador indulgente nulo

Enlace de documentación oficial: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization

Mikhail Zhuravlev
fuente
2

De MS Docs para tipos de entidad con constructores

Cuando EF Core crea instancias de estos tipos, como los resultados de una consulta, primero llamará al constructor sin parámetros predeterminado y luego establecerá cada propiedad en el valor de la base de datos. Sin embargo, si EF Core encuentra un constructor parametrizado con nombres y tipos de parámetros que coincidan con los de las propiedades asignadas, llamará al constructor parametrizado con valores para esas propiedades y no establecerá cada propiedad explícitamente.

¿Quizás valga la pena crear un ctor privado con el parámetro necesario para esas propiedades y ver si el Framework lo llamará y funcionará?

También deshabilitar las advertencias no es una buena idea a menos que esté 100% seguro de que está bien deshabilitarlo.

kobiassvilli
fuente