Làm cách nào để sử dụng các loại tham chiếu không thể sử dụng C # 8.0 với các mô hình Entity Framework Core?


16

Tôi đang kích hoạt các loại tham chiếu không thể sử dụng C # 8.0 trên dự án .NET Core 3.0. Dự án sử dụng Entity Framework Core 3.0 để truy cập cơ sở dữ liệu.

Dưới đây là mô hình dữ liệu có Tiêu đề không được rỗng.

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

Mã riêng được cho là chỉ sử dụng các hàm publictạo trong khi các hàm privatetạo ở đó chỉ để cho phép Entity Framework Core và (cũng có khả năng) tuần tự hóa để liên kết các giá trị từ cơ sở dữ liệu với các lớp / mô hình này. Hàm tạo công khai có thể có cấu trúc, danh sách và loại đối số khác với các thuộc tính mà mô hình có (ví dụ: nó cũng có thể chứa các đối số cho con được yêu cầu đầu tiên, nó có thể có một số đối số tùy chọn, v.v.).

Tuy nhiên, trình biên dịch tạo ra CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.trên các hàm privatetạo.

Tôi có thể vô hiệu hóa CS8616 cho các nhà privatexây dựng bằng cách #pragma warning disable CS8618nhưng tôi không coi đó là một ý tưởng tốt.

Làm thế nào để sử dụng các loại tham chiếu không thể sử dụng C # 8.0 trong kịch bản này? Hoặc là mô hình của tôi không có thật hoặc vi phạm các thực tiễn tốt nhất - làm thế nào để làm điều đó đúng?

Thật không may, tôi đã tìm thấy tài liệu hoặc hướng dẫn không liên quan.


Câu trả lời:


6

Không có cách thích hợp để xử lý các thuộc tính điều hướng không thể rỗng.

  1. Tài liệu cho thấy hai cách và cả hai đều không an toàn. Sử dụng một trường sao lưu và ném UnlimitedOperationException. Không rõ nó khác với việc không làm gì và có NullReferenceException
  2. Ức chế nó với toán tử tha thứ null

Liên kết tài liệu chính thức: https://docs.microsoft.com/en-us/ef/core/misiverse/nullable-reference-types#non-nullable-properies-and-initialization


2

Từ các loại MS Docs for Entity với constructor

Khi EF Core tạo các thể hiện của các loại này, chẳng hạn như đối với kết quả của truy vấn, trước tiên, nó sẽ gọi hàm tạo không tham số mặc định và sau đó đặt từng thuộc tính thành giá trị từ cơ sở dữ liệu. Tuy nhiên, nếu EF Core tìm thấy một hàm tạo được tham số hóa với các tên và kiểu tham số khớp với các thuộc tính được ánh xạ, thì thay vào đó, nó sẽ gọi hàm tạo được tham số hóa với các giá trị cho các thuộc tính đó và sẽ không đặt rõ ràng từng thuộc tính.

Có lẽ nên tạo một ctor riêng với tham số cần thiết cho các thuộc tính đó và xem liệu Framework sẽ gọi nó và làm việc không?

Ngoài ra, vô hiệu hóa các cảnh báo không phải là một ý tưởng hay trừ khi bạn hoàn toàn tin tưởng 100% rằng bạn có thể vô hiệu hóa nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.