Как использовать C # 8.0 обнуляемые ссылочные типы с базовыми моделями Entity Framework? - PullRequest
10 голосов
/ 30 сентября 2019

Я включаю 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 в этом сценарии? Или моя модель фальшивая или нарушает передовой опыт - как это сделать правильно?

К сожалению, я не нашел соответствующих документов или рекомендаций.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Из документов MS для типов сущностей с конструкторами

Когда EF Core создает экземпляры этих типов, например, для результатов запроса, он сначала вызываетконструктор по умолчанию без параметров, а затем установите для каждого свойства значение из базы данных. Однако, если EF Core найдет параметризованный конструктор с именами параметров и типами, которые совпадают с именами сопоставленных свойств, он вместо этого вызовет параметризованный конструктор со значениями для этих свойств и не будет устанавливать каждое свойство явно.

Возможно, стоит создать частный ctor с параметром, необходимым для этих свойств, и посмотреть, будет ли Framework вызывать его и работать?

Также отключение предупреждений не является хорошей идеей, если вы не уверены на 100%, чтоэто нормально, чтобы отключить его.

0 голосов
/ 02 октября 2019

Не существует надлежащего способа обработки ненулевых навигационных свойств.

  1. Документация предлагает два способа, и оба не являются безопасными для типов. Используйте вспомогательное поле и генерируйте исключение InvalidOperationException. Неясно, чем он отличается от ничего не делать и имеет исключение NullReferenceException
  2. Подавить его с помощью оператора NULL-прощающего

Официальная ссылка на документацию: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...