Як використовувати типові контрольні типи C # 8.0 з моделями Entity Framework Core?


16

Я вмикаю C # 8.0 Nullable Reference Types у .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але не вважаю це гарною ідеєю.

Як у цьому сценарії слід використовувати тип Cul 8 Nullable Reference? Або моя модель нечітка або порушує кращі практики - як це зробити правильно?

На жаль, я знайшов невідповідні документи чи вказівки.


Відповіді:


6

Не існує належного способу поводження з ненульовими навігаційними властивостями.

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

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


2

Від типів MS Docs for Entity з конструкторами

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

Можливо, варто створити приватний ctor з параметром, необхідним для цих властивостей, і подивитися, чи буде Framework потім викликати це і працювати?

Також вимкнення попереджень не є хорошою ідеєю, якщо ви повністю не впевнені, що вимкнути це нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.