[c#] Entity Framework Core 모델에서 C # 8.0 Nullable Reference Types를 사용하는 방법은 무엇입니까?

.NET Core 3.0 프로젝트에서 C # 8.0 Nullable Reference Types를 활성화하고 있습니다. 이 프로젝트는 Entity Framework Core 3.0을 사용하여 데이터베이스에 액세스합니다.

다음은 Title이 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;
    }
 }

자체 코드는 public생성자 를 사용하는 동안에 만 private생성자가 있지만 Entity Framework Core 및 직렬화가 데이터베이스의 값을 이러한 클래스 / 모델에 바인딩 할 수 있습니다. 퍼블릭 생성자는 모델이 가진 속성과 다른 구조, 목록 및 인수 유형을 가질 수 있습니다 (예를 들어, 첫 번째 필수 자식에 대한 인수를 포함하거나 선택적 인수 등이있을 수 있음).

그러나 컴파일러 CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.private생성자 에서 생성합니다.

나는 private생성자에 대해 CS8616을 비활성화 할 수 는 #pragma warning disable CS8618있지만 좋은 생각으로 생각하지는 않습니다.

이 시나리오에서 C # 8.0 Nullable Reference Types를 어떻게 사용해야합니까? 또는 내 모델이 가짜이거나 모범 사례를 위반합니까? 올바르게 수행하는 방법은 무엇입니까?

불행히도, 나는 관련 문서 나 지침을 찾지 못했습니다.



답변

널 입력 불가능 탐색 특성을 처리하는 적절한 방법은 없습니다.

  1. 설명서에는 두 가지 방법이 있으며 두 가지 방법 모두 유형 안전하지 않습니다. 백업 필드를 사용하고 InvalidOperationException을 발생시킵니다. 아무것도하지 않는 것과 어떻게 다른지 확실하지 않으며 NullReferenceException이 있습니다.
  2. 널 용서 연산자로 억제

공식 문서 링크 : https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization


답변

로부터 생성자와 엔티티 유형에 대한 MS 문서

EF Core는 쿼리 결과와 같은 이러한 유형의 인스턴스를 만들 때 먼저 기본 매개 변수없는 생성자를 호출 한 다음 각 속성을 데이터베이스의 값으로 설정합니다. 그러나 EF Core가 매핑 된 속성과 일치하는 매개 변수 이름 및 유형을 가진 매개 변수화 된 생성자를 찾으면 대신 해당 속성의 값으로 매개 변수화 된 생성자를 호출하고 각 속성을 명시 적으로 설정하지 않습니다.

아마도 해당 속성에 필요한 매개 변수를 사용하여 개인 ctor를 생성하고 Framework가이를 호출하고 작동하는지 확인할 가치가 있습니까?

또한 경고를 비활성화해도 괜찮다고 확신하지 않는 한 경고를 비활성화하지 않는 것이 좋습니다.


답변