.Net कोर 3.0 संभव वस्तु चक्र का पता चला था जो समर्थित नहीं है


22

मेरे पास 2 संस्थाएं हैं जो एक से कई के रूप में संबंधित हैं

public class Restaurant {
   public int RestaurantId {get;set;}
   public string Name {get;set;}
   public List<Reservation> Reservations {get;set;}
   ...
}
public class Reservation{
   public int ReservationId {get;set;}
   public int RestaurantId {get;set;}
   public Restaurant Restaurant {get;set;}
}

अगर मैं अपने एपीआई का उपयोग करके आरक्षण के साथ रेस्तरां प्राप्त करने की कोशिश करता हूं

   var restaurants =  await _dbContext.Restaurants
                .AsNoTracking()
                .AsQueryable()
                .Include(m => m.Reservations).ToListAsync();
    .....

मुझे प्रतिक्रिया में त्रुटि प्राप्त होती है, क्योंकि वस्तुओं में एक दूसरे के संदर्भ होते हैं। संबंधित पोस्ट हैं जो अलग मॉडल बनाने या न्यूटनसॉफ्टसन कॉन्फ़िगरेशन को जोड़ने की सलाह देते हैं

समस्या यह है कि मैं अलग मॉडल नहीं बनाना चाहता और 2 के सुझाव से मदद नहीं मिली। क्या बिना साइकल संबंध के डेटा लोड करने का कोई तरीका है? *

System.Text.Json.JsonException: एक संभावित ऑब्जेक्ट चक्र का पता लगाया गया था जो समर्थित नहीं है। यह या तो एक चक्र के कारण हो सकता है या यदि ऑब्जेक्ट की गहराई अधिकतम 32 की अधिकतम अनुमत गहराई से अधिक है। System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected (Int32 maxDepth) System.Text.Json.JsonSerializer.Write (यूटी -8) में उपलब्ध है। ,। Microsoft.AspNetCore.Mvc पर WriteResponseBodyAsync (OutputFormatterWriteContext सन्दर्भ, चयनित एन्कोडिंग)।

*


इसे आरक्षण वर्ग की रेस्तरां संपत्ति की अनदेखी करने के लिए कहें।
लास वी। कार्लसन

6
वास्तव में आपको अपने DB संस्थाओं को सीधे अपने API से वापस नहीं करना चाहिए। मेरा सुझाव है कि एपीआई-विशिष्ट डीटीओ बनाना और तदनुसार मैपिंग करना। आपने कहा कि आप ऐसा नहीं करना चाहते थे, लेकिन मैं इसे एपीआई और दृढ़ता इंटर्नल को अलग रखने के लिए सामान्य अच्छा अभ्यास मानूंगा।
मैके

"और दूसरे सुझाव ने मदद नहीं की" विवरण की आवश्यकता है।
हेंक होल्टरमैन 18

"समस्या यह है कि मैं अलग मॉडल नहीं बनाना चाहता"। जब तक आप ऐसा नहीं करते, तब तक आपका डिज़ाइन मौलिक रूप से त्रुटिपूर्ण है। एक एपीआई एक इंटरफेस की तरह एक अनुबंध है (यह सचमुच एक एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस है )। इसे कभी भी बदलना नहीं चाहिए, एक बार प्रकाशित होने के बाद, और किसी भी बदलाव के लिए एक नए संस्करण की आवश्यकता होती है, जिसे पुराने संस्करण के साथ समवर्ती रूप से चलाने की आवश्यकता होगी (जिसे भविष्य में हटा दिया जाएगा और अंततः हटा दिया जाएगा)। यह क्लाइंट को अपने कार्यान्वयन को अपडेट करने का समय देता है। यदि आप किसी इकाई को सीधे लौटाते हैं, तो आप अपनी डेटा परत को कसकर जोड़ रहे हैं।
क्रिस प्रैट

उस डेटा लेयर में कोई भी परिवर्तन तब एपीआई के लिए तत्काल और अपरिवर्तनीय परिवर्तन की आवश्यकता है, जब तक कि वे अपने कार्यान्वयन को अपडेट नहीं करते, सभी ग्राहकों को तुरंत तोड़ दें। मामले में यह स्पष्ट नहीं है, यह एक बुरी बात है। संक्षेप में: किसी API से इकाइयाँ कभी स्वीकार या वापस न करें। आपको हमेशा डीटीओ का उपयोग करना चाहिए ।
क्रिस प्रैट

जवाबों:


32

मैं एक नई परियोजना में अपने कोड की कोशिश की है और दूसरी तरह से अच्छी तरह से पैकेज स्थापित करने के बाद काम करने लगता है Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.0 के लिए सबसे पहले

services.AddControllerWithViews()
    .AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);

एक नई परियोजना के साथ प्रयास करें और मतभेदों की तुलना करें।


1
यहां महत्वपूर्ण क्षण Microsoft.AspNetCore.Mvc.NewtonsoftJson के उचित संस्करण को पुन: स्थापित करने के लिए है, मैंने संस्करण के लिए ध्यान नहीं दिया क्योंकि यह पैकेज बिना किसी त्रुटि और चेतावनी के बॉक्स के नीचे उपलब्ध था! उत्तर के लिए धन्यवाद ! सब कुछ ठीक वैसा ही काम करता है जैसा मुझे उम्मीद थी!
नजर प्लीप

1
क्या यह गलत नहीं है कि सिस्टम जोंस के बेहतर सुधार के साथ, हमें न्यूटनसॉफ्टसन का उपयोग करना होगा? : /
मारेक अर्बनोविक

40

.NET कोर 3.1 पैकेज स्थापित करें। Microsoft.AspNetCore.Mvc.NewtonsoftJson

Startup.cs सेवा जोड़ें

services.AddControllers().AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);

1
क्या आप अपनी प्रतिक्रिया को प्रारूपित कर सकते हैं और कुछ विवरण जोड़ सकते हैं? यह अपठनीय है।
सिड

अधिक जानकारी के लिए, देखें: thecodebuzz.com/-
डिएगो

4

काम करने के लिए स्टार्टअप पर सेटिंग JSON क्रमबद्धता विकल्प प्राप्त करना संभवतः एक पसंदीदा तरीका है क्योंकि आपके पास भविष्य में इसी तरह के मामले होने की संभावना होगी। हालांकि इस बीच आप अपने मॉडल में डेटा विशेषताओं को जोड़ने का प्रयास कर सकते हैं, इसलिए यह क्रमबद्ध नहीं है: https://www.newtonsoft.com/json/help/html/PropertyJsonIgnore.htm

public class Reservation{ 
    public int ReservationId {get;set;} 
    public int RestaurantId {get;set;} 
    [JsonIgnore]
    public Restaurant Restaurant {get;set;} 
}

यह भी काम करता है। लेकिन जैसा कि आपने उल्लेख किया है, इसके साथ आपको सभी मॉडलों को अपडेट करना होगा, मैं सेवाओं को पसंद करता हूं। एडकंट्रोलर () AddNewtonsoftJson (विकल्प => विकल्प। SerializerSettings.ReferenceLoopHandling: #tonsoft.Json.ReferenceLoopHandling.Ignore);
नन्थारूपन

1
public class Reservation{ 
public int ReservationId {get;set;} 
public int RestaurantId {get;set;} 
[JsonIgnore]
public Restaurant Restaurant {get;set;} 

ऊपर भी काम किया। लेकिन मैं निम्नलिखित को पसंद करता हूं

services.AddControllers().AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);

क्योंकि पहले हमें उन सभी मॉडलों में विशेषता जोड़ने की आवश्यकता है जिनके लिए हमारे पास चक्रीय संदर्भ हो सकता है।

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