Bagaimana cara menggunakan C # 8.0 Jenis Referensi Nullable dengan model Core Entity Framework?

16

Saya mengaktifkan C # 8.0 Jenis Referensi Nullable pada proyek .NET Core 3.0. Proyek ini menggunakan Entity Framework Core 3.0 untuk mengakses database.

Berikut ini adalah model data yang Judulnya tidak boleh nol.

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;
    }
 }

Kode sendiri seharusnya hanya menggunakan publickonstruktor sementara privatekonstruktor ada hanya untuk memungkinkan Entity Framework Core dan (berpotensi juga) serialisasi untuk mengikat nilai dari database ke kelas / model ini. Konstruktor publik mungkin memiliki struktur, daftar, dan jenis argumen yang berbeda dari properti yang dimiliki model (misalnya, mungkin juga berisi argumen untuk anak pertama yang diperlukan, mungkin memiliki beberapa argumen opsional, dll.).

Namun, kompiler menghasilkan CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.pada privatekonstruktor.

Saya dapat menonaktifkan CS8616 untuk privatekonstruktor dengan #pragma warning disable CS8618tetapi saya tidak menganggap itu sebagai ide yang bagus.

Bagaimana seharusnya menggunakan C # 8.0 Jenis Referensi Nullable dalam skenario ini? Atau apakah model saya palsu atau melanggar praktik terbaik - bagaimana melakukannya dengan benar?

Sayangnya, saya tidak menemukan dokumen atau panduan yang relevan.

alik
sumber

Jawaban:

6

Tidak ada cara yang tepat untuk menangani properti navigasi yang tidak dapat dibatalkan.

  1. Dokumentasi menyarankan dua cara dan keduanya bukan tipe aman. Gunakan bidang dukungan dan melemparkan InvalidOperationException. Tidak jelas bagaimana hal itu berbeda dari tidak melakukan apa-apa dan memiliki NullReferenceException
  2. Menekannya dengan operator pemaaf nol

Tautan dokumentasi resmi: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization

Mikhail Zhuravlev
sumber
2

Dari jenis MS Documents untuk Entitas dengan konstruktor

Ketika EF Core membuat contoh jenis ini, seperti untuk hasil kueri, pertama-tama ia akan memanggil konstruktor tanpa parameter default dan kemudian mengatur setiap properti dengan nilai dari database. Namun, jika EF Core menemukan konstruktor parameter dengan nama dan tipe parameter yang cocok dengan properti yang dipetakan, maka itu akan memanggil konstruktor parameter dengan nilai untuk properti tersebut dan tidak akan mengatur setiap properti secara eksplisit.

Mungkin layak membuat ctor pribadi dengan parameter yang diperlukan untuk properti tersebut dan melihat apakah Kerangka kemudian akan memanggil itu dan bekerja?

Menonaktifkan peringatan juga bukan ide yang bagus kecuali jika Anda sepenuhnya 100% yakin bahwa itu tidak masalah untuk menonaktifkannya.

kobiassvilli
sumber