इकाई फ्रेमवर्क कोर मॉडल के साथ C # 8.0 अशक्त संदर्भ प्रकार का उपयोग कैसे करें?


16

मैं .NET कोर 3.0 प्रोजेक्ट पर C # 8.0 Nullable Reference Types को सक्षम कर रहा हूं। डेटाबेस तक पहुँचने के लिए प्रोजेक्ट 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एंटिटी फ्रेमवर्क कोर और (संभवतः यह भी) को अनुमति देने के लिए डेटाबेस से इन वर्गों / मॉडलों के लिए मानों को क्रमबद्ध करते हैं। सार्वजनिक निर्माणकर्ता के पास अलग-अलग संरचना, सूची और प्रकार के तर्क हो सकते हैं, जिसमें मॉडल के गुण हैं (उदाहरण के लिए, इसमें पहले आवश्यक बच्चे के लिए तर्क भी हो सकते हैं, इसमें कुछ तर्क वैकल्पिक हो सकते हैं)।

हालाँकि, कंस्ट्रक्टर CS8618 Non-nullable field is uninitialized. Consider declaring as nullable.पर कंपाइलर उत्पन्न होता है private

मैं के लिए अक्षम CS8616 करने में सक्षम हूँ privateसे कंस्ट्रक्टर्स #pragma warning disable CS8618लेकिन मैं उस पर विचार नहीं करते एक अच्छा विचार के रूप में।

इस परिदृश्य में C # 8.0 अशक्त संदर्भ प्रकारों का उपयोग करना कैसे माना जाता है? या मेरा मॉडल फर्जी है या सर्वोत्तम प्रथाओं का उल्लंघन करता है - इसे ठीक से कैसे करें?

Unfortunatelly, मैंने प्रासंगिक डॉक्स या मार्गदर्शन नहीं पाया है।


जवाबों:


6

गैर-अशक्त नौवहन गुणों को संभालने का कोई उचित तरीका नहीं है।

  1. प्रलेखन दो तरीके सुझाता है और दोनों प्रकार सुरक्षित नहीं हैं। बैकिंग फ़ील्ड का उपयोग करें और InvalidOperationException को फेंक दें। यह स्पष्ट नहीं है कि यह कैसे कुछ नहीं करने से अलग है और NullReferenceException है
  2. इसे नल क्षमा करने वाले ऑपरेटर के साथ दबाएं

आधिकारिक दस्तावेज लिंक: https://docs.microsoft.com/en-us/ef/core/misc विविध/ nullable- reference-types#non-nullable-properties-and- initialization


2

निर्माणकर्ताओं के साथ इकाई प्रकारों के लिए एमएस डॉक्स से

जब EF Core इन प्रकारों के उदाहरण बनाता है, जैसे कि किसी क्वेरी के परिणामों के लिए, यह पहले डिफ़ॉल्ट पैरामीटर रहित कंस्ट्रक्टर को कॉल करेगा और फिर डेटाबेस से प्रत्येक प्रॉपर्टी को वैल्यू पर सेट करेगा। हालांकि, अगर ईएफ कोर पैरामीटर नाम और प्रकार के साथ एक पैरामीटर निर्मित निर्माता पाता है जो मैप किए गए गुणों से मेल खाता है, तो यह बदले में उन गुणों के लिए पैरामीटर वाले निर्माता को कॉल करेगा और प्रत्येक संपत्ति को स्पष्ट रूप से सेट नहीं करेगा।

शायद यह उन गुणों के लिए आवश्यक पैरामीटर के साथ एक निजी ctor बनाने के लायक है और देखें कि क्या फ्रेमवर्क तब कॉल करेगा और काम करेगा?

चेतावनियों को अक्षम करना एक अच्छा विचार नहीं है जब तक कि आप पूरी तरह से 100% आश्वस्त न हों कि इसे अक्षम करना ठीक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.