भिन्नता के एक संभवतः नल संदर्भ में इकाई की रूपरेखा 6 क्वेरी

0

सवाल

मैं एक है .नेट 6 परियोजना के साथ नल संदर्भ प्रकार सक्षम (<Nullable>enable</Nullable>). मैं इस एफई इकाई:

public class PostFile {
  public Int32 UserId { get; set; }
  public Int32 PostId { get; set; }

  public virtual User? User { get; set; }
  public virtual Post? Post { get; set; }
}

मैं जोड़ा गया ? ऊपर इस को रोकने के लिए नल चेतावनी:

Non-nullable property '...' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.

अब, मैं इस इकाई की रूपरेखा 6 LINQ क्वेरी:

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId);

... लेकिन मैं प्राप्त निम्न चेतावनी:

Dereference of a possibly null reference.

... के इस हिस्से पर मेरा प्रश्न है:

x.User.Id == ...

कैसे कर सकते हैं मैं यह तय चेतावनी?

4

सबसे अच्छा जवाब

2

मुझे लगता है कि आप का मतलब है की तरह कुछ:

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

अपने मूल मुद्दे को एक चेतावनी है कि सी#8 के साथ पेश किया जा रहा है और अधिक स्पष्ट के साथ नल-सक्षम संदर्भ प्रकार के । के लिए, एक इकाई के कार्यान्वयन के ऊपर मान्य नहीं है जब तक कि इन रिश्तों को वास्तव में कर रहे हैं, जो वैकल्पिक की आवश्यकता होगी उनके FK क्षेत्रों (यूजर आईडी और PostId) के लिए भी अशक्त करने में सक्षम है. वे होने की संभावना कर रहे हैं नहीं optional.

मुख्य विकल्प यह पता करने के लिए:

एक) सुविधा को बंद करें. (अक्षम नल-सक्षम संदर्भ में परियोजना)

ख) पूछना "क्षमा" के लिए तथ्य यह है कि ये कभी नहीं होना चाहिए null, लेकिन नहीं किया जाएगा में एक वैध राज्य पर निर्माण. (एफई उन्हें प्रबंधन करेगा)

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User User { get; set; } = null!;
    public virtual Post Post { get; set; } = null!;
}

फेरबदल के मॉडल को चिह्नित करने के लिए नेविगेशन गुण के रूप में नल-सक्षम संदर्भ पैदा होने की संभावना है समस्याओं के सभी प्रकार के साथ के रूप में, माइग्रेशन यह कर सकते हैं, और शुरू कर देंगे की जगह गैर-नल-कर fks बड़ा के साथ नल-सक्षम हैं. चिह्नित करने के लिए इन संदर्भों के रूप में नल-सक्षम और रखने एफई खुश:

public class PostFile {
    public Int32? UserId{ get; set; }
    public Int32? PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

जो लगभग निश्चित रूप से नहीं क्या आप चाहते हैं कि आपके डोमेन में, या यहां तक कि कानूनी यदि यूजर आईडी और PostId का हिस्सा हैं एक पी.

व्यक्तिगत रूप से मैं कर रहा हूँ chalking में इस बदलाव के C# के रूप में एक "भूमि" मेरा एमएस में सक्षम शुरू में डिफ़ॉल्ट रूप से, इस तरह के रूप में ग्राहक के पक्ष में मूल्यांकन EF. :) मैं उम्मीद में कई-एक-StackOverflow सवालों के आसपास इस चेतावनी या तोड़ने के परिवर्तन, और कई एक ग्राहक codebases से अटे पड़े "!" क्षमा टैग के रूप में बड़े गैर-नल-सक्षम वस्तुओं/सन्दर्भ में पारित कर रहे हैं कोड के साथ नल-सक्षम संदर्भ की जाँच करता है ।

2021-11-24 23:15:24
1

आप चिह्नित करना चाहिए नेविगेशन की संस्थाओं के रूप में nullable. आप नहीं होना चाहिए आलसी लोड हो रहा सक्षम है, और इसलिए नेविगेशन गुण लौटा जा सकता है के रूप में null से प्रश्नों. यहां तक कि अगर वे कर रहे हैं आवश्यक डेटाबेस में, अपने कोड नहीं है, उन्हें लोड करने के लिए.

आपकी क्वेरी में भाव हैं, तो आप कुछ किया जा सकता है कि इकाई की रूपरेखा के लिए नहीं जा रहा उन पर अमल क्लायंटसाइड, लेकिन पार्स एक SQL क्वेरी से बाहर उन्हें.

इसलिए:

.Where(x => x.User!.Id == request.UserId)

आप बता सकते हैं संकलक के साथ User! तुम्हें पता है कि यह नहीं होगा अशक्त वहाँ. जब तक आप सक्षम क्लायंटसाइड मूल्यांकन, लेकिन तुम नहीं करना चाहिए, और यदि आप करते हैं, आप की आवश्यकता होगी एक अशक्त की जांच के साथ वहाँ वैसे भी है.

के लिए के रूप में उपयोग के PostFile.User, के रूप में:

var postFile = dbContext.PostFiles.FirstOrDefault(p => p....) ?? throw ...;
var user = postFile.User;

वहाँ यह किया जा सकता है null अगर तुम नहीं किया Include(p => p.User) और नहीं है आलसी लोड हो रहा सक्षम है, तो user की आवश्यकता होगी एक अशक्त की जांच से पहले उपयोग.

अगर आप क्या का उपयोग आलसी लोड हो रहा है, तो आप को निष्क्रिय कर सकते हैं चेतावनी:

#pragma warning disable CS8618 // EF initializes these properties through lazy loading
    public virtual User User { get; set; }
#pragma warning restore CS8618 
2021-11-24 22:37:30
0

मुझे लगता है कि आप इस की जरूरत है:

public class PostFile {
    public User User { get; set; }
    public Post Post { get; set; }
}

और कॉल

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId).Include(x => x.Post);
2021-11-24 22:52:47

नहीं । नहीं अंकन इन गुणों के रूप में nullable बनाता है संकलक का उत्सर्जन चेतावनी है कि वे हो सकता है नहीं प्रारंभ की जा है, जो सच है.
CodeCaster
0

के बारे में क्या var postFiles = context.postFiles.Where(x => x.User != null && x.User.Id == request.UserId);?

2021-11-24 22:53:01

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में