.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를 어떻게 사용해야합니까? 또는 내 모델이 가짜이거나 모범 사례를 위반합니까? 올바르게 수행하는 방법은 무엇입니까?
불행히도, 나는 관련 문서 나 지침을 찾지 못했습니다.
답변
널 입력 불가능 탐색 특성을 처리하는 적절한 방법은 없습니다.
- 설명서에는 두 가지 방법이 있으며 두 가지 방법 모두 유형 안전하지 않습니다. 백업 필드를 사용하고 InvalidOperationException을 발생시킵니다. 아무것도하지 않는 것과 어떻게 다른지 확실하지 않으며 NullReferenceException이 있습니다.
- 널 용서 연산자로 억제
답변
EF Core는 쿼리 결과와 같은 이러한 유형의 인스턴스를 만들 때 먼저 기본 매개 변수없는 생성자를 호출 한 다음 각 속성을 데이터베이스의 값으로 설정합니다. 그러나 EF Core가 매핑 된 속성과 일치하는 매개 변수 이름 및 유형을 가진 매개 변수화 된 생성자를 찾으면 대신 해당 속성의 값으로 매개 변수화 된 생성자를 호출하고 각 속성을 명시 적으로 설정하지 않습니다.
아마도 해당 속성에 필요한 매개 변수를 사용하여 개인 ctor를 생성하고 Framework가이를 호출하고 작동하는지 확인할 가치가 있습니까?
또한 경고를 비활성화해도 괜찮다고 확신하지 않는 한 경고를 비활성화하지 않는 것이 좋습니다.