Ich aktiviere C # 8.0 Nullable Reference Types in einem .NET Core 3.0-Projekt. Das Projekt verwendet Entity Framework Core 3.0, um auf die Datenbank zuzugreifen.
Das folgende ist ein Datenmodell, dessen Titel nicht null sein sollte.
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;
}
}
Eigener Code soll die public
Konstruktoren nur verwenden, während die private
Konstruktoren nur dazu da sind, Entity Framework Core und (möglicherweise auch) Serialisierung das Binden von Werten aus der Datenbank an diese Klassen / Modelle zu ermöglichen. Der öffentliche Konstruktor verfügt möglicherweise über eine andere Struktur, Liste und andere Arten von Argumenten als die Eigenschaften des Modells (z. B. enthält er möglicherweise auch Argumente für das erste erforderliche untergeordnete Element, möglicherweise einige optionale Argumente usw.).
Der Compiler generiert jedoch CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.
auf den private
Konstruktoren.
Ich kann CS8616 für die private
Konstruktoren von deaktivieren, halte #pragma warning disable CS8618
dies jedoch nicht für eine gute Idee.
Wie sollen in diesem Szenario nullfähige C # 8.0-Referenztypen verwendet werden? Oder ist mein Modell falsch oder verstößt gegen Best Practices - wie geht das richtig?
Leider habe ich keine relevanten Dokumente oder Anleitungen gefunden.
Antworten:
Es gibt keine geeignete Möglichkeit, mit nicht nullbaren Navigationsmerkmalen umzugehen.
Offizieller Dokumentationslink: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization
quelle
Aus den MS Docs for Entity-Typen mit Konstruktoren
Vielleicht lohnt es sich, einen privaten Ctor mit dem für diese Eigenschaften erforderlichen Parameter zu erstellen und zu prüfen, ob das Framework dies dann aufruft und funktioniert?
Das Deaktivieren von Warnungen ist ebenfalls keine gute Idee, es sei denn, Sie sind zu 100% sicher, dass das Deaktivieren in Ordnung ist.
quelle