Come utilizzare i tipi di riferimento Nullable di C # 8.0 con i modelli di Entity Framework Core?


16

Sto abilitando i tipi di riferimento Nullable di C # 8.0 su un progetto .NET Core 3.0. Il progetto utilizza Entity Framework Core 3.0 per accedere al database.

Di seguito è riportato un modello di dati il ​​cui titolo non deve essere nullo.

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

Il codice proprio dovrebbe usare i publiccostruttori solo mentre i privatecostruttori sono lì solo per consentire a Entity Framework Core e (potenzialmente anche) alla serializzazione di associare i valori dal database a queste classi / modelli. Il costruttore pubblico potrebbe avere struttura, elenco e tipi di argomenti diversi rispetto alle proprietà del modello (ad esempio, potrebbe contenere anche argomenti per il primo figlio richiesto, potrebbe avere alcuni argomenti facoltativi ecc.).

Tuttavia, il compilatore genera CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.sui privatecostruttori.

Sono in grado di disabilitare CS8616 per i privatecostruttori #pragma warning disable CS8618ma non lo considero una buona idea.

Come dovrebbe usare i tipi di riferimento nullable di C # 8.0 in questo scenario? O il mio modello è falso o viola le migliori pratiche - come farlo correttamente?

Sfortunatamente, ho trovato documenti o indicazioni non pertinenti.


Risposte:


6

Non esiste un modo corretto per gestire le proprietà di navigazione non annullabili.

  1. La documentazione suggerisce due modi ed entrambi non sono sicuri. Utilizzare un campo di supporto e generare InvalidOperationException. Non è chiaro come differisca dal non fare nulla e avere una NullReferenceException
  2. Sopprimilo con un operatore che perdona nulla

Link alla documentazione ufficiale: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization


2

Da MS Docs per tipi di entità con costruttori

Quando EF Core crea istanze di questi tipi, ad esempio per i risultati di una query, per prima cosa chiama il costruttore senza parametri predefinito e quindi imposta ogni proprietà sul valore dal database. Tuttavia, se EF Core trova un costruttore con parametri con nomi e tipi di parametro che corrispondono a quelli delle proprietà mappate, chiamerà invece il costruttore con parametri con valori per tali proprietà e non imposterà esplicitamente ciascuna proprietà.

Forse vale la pena creare un ctor privato con il parametro necessario per quelle proprietà e vedere se il Framework lo chiamerà e funzionerà?

Anche disabilitare gli avvisi non è una buona idea a meno che tu non sia completamente sicuro al 100% che sia giusto disabilitarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.