วิธีการใช้ C # 8.0 ชนิดอ้างอิงที่สามารถลบล้างได้ด้วยโมเดล Entity Framework Core ได้อย่างไร


16

ฉันเปิดใช้งาน C # 8.0 ประเภทการอ้างอิงที่เป็นโมฆะในโครงการ. NET Core 3.0 โครงการใช้ Entity Framework Core 3.0 เพื่อเข้าถึงฐานข้อมูล

ต่อไปนี้เป็นตัวแบบข้อมูลที่หัวเรื่องไม่ควรเป็นโมฆะ

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สร้าง

ฉันสามารถปิดการใช้งาน CS8616 สำหรับตัวprivateสร้างได้#pragma warning disable CS8618แต่ฉันไม่คิดว่าเป็นความคิดที่ดี

มันควรจะใช้ C # 8.0 ชนิดอ้างอิงที่ทำให้เป็นโมฆะในสถานการณ์นี้ได้อย่างไร? หรือโมเดลของฉันเป็นการหลอกลวงหรือละเมิดแนวปฏิบัติที่ดีที่สุด - จะทำอย่างไรให้ถูกต้อง?

น่าเสียดายที่ฉันพบเอกสารหรือคำแนะนำที่ไม่เกี่ยวข้อง


คำตอบ:


6

ไม่มีวิธีที่เหมาะสมในการจัดการคุณสมบัติการนำทางที่ไม่เป็นโมฆะ

  1. เอกสารแนะนำสองวิธีและทั้งสองประเภทไม่ปลอดภัย ใช้ฟิลด์สำรองและโยน InvalidOperationException มันไม่ชัดเจนว่ามันแตกต่างจากการไม่ทำอะไรเลยและมี NullReferenceException
  2. ระงับมันด้วยโอเปอเรเตอร์ที่ให้อภัยเป็นโมฆะ

ลิงค์เอกสารอย่างเป็นทางการ: https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types#non-nullable-properties-and-initialization


2

จากเอกสาร MS สำหรับประเภทองค์กรที่มีตัวสร้าง

เมื่อ EF Core สร้างอินสแตนซ์ของประเภทเหล่านี้เช่นสำหรับผลลัพธ์ของเคียวรีมันจะเรียกคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เริ่มต้นก่อนจากนั้นตั้งค่าแต่ละคุณสมบัติเป็นค่าจากฐานข้อมูล อย่างไรก็ตามหาก EF Core พบคอนสตรัคต์แบบกำหนดพารามิเตอร์ที่มีชื่อพารามิเตอร์และประเภทที่ตรงกับคุณสมบัติของแมปแล้วมันจะเรียกคอนสตรัคเตอร์แบบกำหนดพารามิเตอร์ด้วยค่าสำหรับคุณสมบัติเหล่านั้นและจะไม่ตั้งค่าแต่ละคุณสมบัติอย่างชัดเจน

บางทีมันอาจคุ้มค่าในการสร้าง ctor ส่วนตัวพร้อมพารามิเตอร์ที่จำเป็นสำหรับคุณสมบัติเหล่านั้นและดูว่า Framework จะเรียกใช้และทำงานอย่างไร?

การปิดใช้งานคำเตือนนั้นไม่ใช่ความคิดที่ดีหากคุณไม่มั่นใจอย่างเต็มที่ 100% ว่าไม่สามารถปิดใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.