Włączam typy referencyjne Nullable C # 8.0 w projekcie .NET Core 3.0. Projekt korzysta z Entity Framework Core 3.0, aby uzyskać dostęp do bazy danych.
Poniżej przedstawiono model danych, którego tytuł nie powinien mieć wartości 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;
}
}
Własny kod ma używać public
konstruktorów tylko wtedy, gdy private
konstruktory są tam po to, aby umożliwić Entity Framework Core i (potencjalnie również) serializacji powiązać wartości z bazy danych z tymi klasami / modelami. Konstruktor publiczny może mieć inną strukturę, listę i typy argumentów niż właściwości, które ma model (na przykład może również zawierać argumenty dla pierwszego wymaganego dziecka, niektóre argumenty mogą być opcjonalne itp.).
Jednak kompilator generuje CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.
na private
konstruktorach.
Jestem w stanie wyłączyć CS8616 dla private
konstruktorów, #pragma warning disable CS8618
ale nie uważam tego za dobry pomysł.
Jak w tym scenariuszu należy używać typów referencyjnych dopuszczających wartości zerowe C # 8.0? A może mój model jest fałszywy lub narusza najlepsze praktyki - jak to zrobić poprawnie?
Niestety nie znalazłem odpowiednich dokumentów ani wskazówek.
Odpowiedzi:
Nie ma właściwego sposobu obsługi właściwości nawigacyjnych, które nie zawierają wartości zerowych.
Oficjalny link do dokumentacji: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization
źródło
Z MS Docs dla typów jednostek z konstruktorami
Być może warto utworzyć prywatny ctor z parametrem potrzebnym dla tych właściwości i sprawdzić, czy Framework zadzwoni i zadziała?
Wyłączenie ostrzeżeń nie jest dobrym pomysłem, chyba że masz pełną 100% pewność, że można je wyłączyć.
źródło