Entity Framework CoreモデルでC#8.0 Nullable参照型を使用する方法


16

.NET Core 3.0プロジェクトでC#8.0 Nullable参照型を有効にしています。プロジェクトはEntity Framework Core 3.0を使用してデータベースにアクセスします。

以下は、タイトルがnullであってはならないデータモデルです。

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

独自のコードは、Entity Framework Coreと(場合によっては)シリアル化でデータベースからこれらのクラス/モデルに値をバインドできるようにするためにコンストラクターが存在する場合にpublicのみ、コンストラクターを使用することになっていますprivate。パブリックコンストラクターは、モデルのプロパティとは異なる構造、リスト、および引数のタイプを持っている場合があります(たとえば、最初の必須の子の引数が含まれている場合や、オプションの引数がある場合など)。

ただし、コンパイラーCS8618 Non-nullable field is uninitialized. Consider declaring as nullable.privateコンストラクターで生成します。

私はprivateコンストラクターでCS8616を無効にすることができ#pragma warning disable CS8618ますが、それは良い考えではないと思います。

このシナリオでC#8.0 Nullable参照型を使用する方法を教えてください。または、私のモデルは偽物であるか、ベストプラクティスに違反していますか?適切に行う方法は?

残念ながら、関連するドキュメントやガイダンスは見つかりませんでした。


回答:


6

nullにできないナビゲーションプロパティを処理する適切な方法はありません。

  1. ドキュメントには2つの方法があり、どちらもタイプセーフではありません。バッキングフィールドを使用して、InvalidOperationExceptionをスローします。それが何もしないこととどのように違うのか明確ではなく、NullReferenceExceptionがあります
  2. null許容演算子で抑制します

公式ドキュメントリンク:https : //docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization


2

コンストラクター付きのエンティティ型のMS Docsから

EF Coreがクエリの結果などのためにこれらのタイプのインスタンスを作成するとき、最初にデフォルトのパラメーターなしのコンストラクターを呼び出し、次に各プロパティをデータベースの値に設定します。ただし、EF Coreがパラメーター化されたプロパティのパラメーター名と型と一致するパラメーター化されたコンストラクターを見つけると、代わりにそれらのプロパティの値を使用してパラメーター化されたコンストラクターを呼び出し、各プロパティを明示的に設定しません。

おそらく、それらのプロパティに必要なパラメーターを使用してプライベートctorを作成し、Frameworkがそれを呼び出して機能するかどうかを確認する価値はありますか?

また、警告を無効にしても問題がないことを100%確信していない限り、警告を無効にすることはお勧めできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.