Я включаю C # 8.0 Обнуляемые ссылочные типы в проекте .NET Core 3.0. Проект использует Entity Framework Core 3.0 для доступа к базе данных.
Ниже приведена модель данных, название которой не должно быть нулевым.
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
конструкторы существуют только для того, чтобы позволить Entity Framework Core и (возможно, также) сериализации связывать значения из базы данных с этими классами / моделями. Открытый конструктор может иметь структуру, список и типы аргументов, отличные от свойств модели (например, он также может содержать аргументы для первого обязательного дочернего элемента, некоторые аргументы могут быть необязательными и т. Д.).
Тем не менее, компилятор генерирует CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.
на private
конструкторы.
Я могу отключить CS8616 для private
конструкторов, #pragma warning disable CS8618
но я не считаю это хорошей идеей.
Как предполагается использовать C # 8.0 Nullable Reference Types в этом сценарии? Или моя модель фальшивая или нарушает лучшие практики - как это сделать правильно?
К сожалению, я не нашел соответствующих документов или рекомендаций.
Ответы:
Не существует правильного способа обработки ненулевых навигационных свойств.
Официальная ссылка на документацию: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization
источник
Из MS Docs для типов сущностей с конструкторами
Возможно, стоит создать частный ctor с параметром, необходимым для этих свойств, и посмотреть, будет ли Framework вызывать его и работать?
Отключение предупреждений также не является хорошей идеей, если вы не уверены на 100%, что отключить его можно.
источник