। নেট কোর 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();
    .....

প্রতিক্রিয়াতে আমি ত্রুটি পেয়েছি, কারণ বস্তুগুলিতে একে অপরের উল্লেখ রয়েছে। সম্পর্কিত পোস্ট রয়েছে যা আলাদা মডেল তৈরি করতে বা নিউটনসফটজসন কনফিগারেশন যুক্ত করার পরামর্শ দেয়

সমস্যাটি হ'ল আমি আলাদা মডেল তৈরি করতে চাই না এবং ২ য় প্রস্তাবটি সহায়তা করে নি। চক্রযুক্ত সম্পর্ক ছাড়া ডেটা লোড করার কোনও উপায় আছে কি? *

System.Text.Json.JsonException: একটি সম্ভাব্য অবজেক্ট চক্র সনাক্ত হয়েছে যা সমর্থিত নয়। এটি হয় চক্রের কারণে বা যদি অবজেক্টের গভীরতা 32 এর সর্বোচ্চ অনুমোদিত গভীরতার চেয়ে বড় হয় than , সিস্টেম.টেক্সট.জসন.জসনসিরাইজার.উইটআরসিএনসিওরে (স্ট্রিম utf8Json, অবজেক্ট ভ্যালু, টাইপ ইনপুটটাইপ, জসনসিরাইজারআইপশন অপশনসেন্টসট্রপশনসট্রপশন.ট্রোপশন.ট্রোপশন.ট্রোপশন.ট্রোপশন.ট্রোশনসট্রটেকশনসট্রটেক্সট্রেশনসট্রটেকশনসট্রেটসনট্রটারসট্রোটারসট্রেশনসেন্টসট্রেশনসট্রোটটারসট্রেশনসট্রেশনসট্রেশনসট্রেশনসট্রেশনসট্রেশনসট্রেশনসেন্টসট্রেশনসট্রেশনসেন্টসট্রেশনসট্রেশনসট্রেশনসট্রেশনসট্রেশনসট্রেশনসেন্টসট্রেশনসট্রটসনট্রটারসট্রটারসট্রাস্ট্রেশন) .সিটিএস.টেক্সট.জসন.জসনসরাইলাইজার.উত্তরণ করুন। মাইক্রোসফ্ট.এএসপনেটকোর.এমভিসি-তে WritResponseBodyAsync (আউটপুটফর্মেটরাইট্রাইটকন্টেক্সট প্রসঙ্গ, এনকোডিং নির্বাচিত এনকোডিং)।

*


এটি সংরক্ষণ শ্রেণীর রেস্তোঁরা সম্পত্তিটি উপেক্ষা করতে বলুন।
লাসে ভি। কার্লসেন

6
সত্যিই আপনি সরাসরি আপনার এপিআই থেকে আপনার ডিবি সত্তা ফেরত যাবেন না। আমি এপিআই-নির্দিষ্ট ডিটিও তৈরি করতে এবং সেই অনুসারে ম্যাপিংয়ের পরামর্শ দেব। মঞ্জুর করে আপনি বলেছিলেন যে আপনি এটি করতে চান না তবে আমি এপিআই এবং দৃistence়তা ইন্টার্নালগুলি আলাদা রাখার সাধারণ অভ্যাসটি বিবেচনা করব।
ম্যাকি

"এবং ২ য় পরামর্শের সাহায্য হয়নি" বিশদ বিবরণ প্রয়োজন।
হেন্ক হলটারম্যান

"সমস্যাটি হ'ল আমি আলাদা মডেল তৈরি করতে চাই না"। আপনার নকশা মৌলিকভাবে ত্রুটিযুক্ত যদি আপনি এটি না করেন। একটি এপিআই হ'ল একটি ইন্টারফেসের মতো চুক্তি (এটি আক্ষরিক অর্থে একটি অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস )। এটি কখনই পরিবর্তিত হওয়া উচিত নয়, একবার প্রকাশিত হয়েছিল এবং কোনও পরিবর্তনই নতুন সংস্করণের প্রয়োজন, যা পুরানো সংস্করণ (যা অবমানিত হবে এবং ভবিষ্যতে অবশেষে মুছে ফেলা হবে) সহ একযোগে চালানো দরকার। এটি ক্লায়েন্টদের তাদের প্রয়োগগুলি আপডেট করার জন্য সময় দেয়। আপনি যদি কোনও সত্তা প্রত্যক্ষভাবে ফিরিয়ে দেন তবে আপনি নিজের ডেটা স্তরটিকে শক্তভাবে সংযুক্ত করছেন ling
ক্রিস প্র্যাট

সেই ডেটা স্তরের যে কোনও পরিবর্তন তারপরে সমস্ত ক্লায়েন্টকে বাস্তবায়ন আপডেট না করা অবধি তত্ক্ষণাত্ এপিআই-তে তাত্ক্ষণিক এবং অপরিবর্তনীয় পরিবর্তন প্রয়োজন। যদি এটি সুস্পষ্ট না হয় তবে এটি একটি খারাপ জিনিস। সংক্ষেপে: কখনও কোনও এপিআই থেকে স্বীকৃতি গ্রহণ বা ফেরত পাবেন না। আপনার সর্বদা ডিটিও ব্যবহার করা উচিত ।
ক্রিস প্র্যাট

উত্তর:


32

আমি একটি নতুন প্রকল্পে আপনার কোড চেষ্টা করেছি এবং দ্বিতীয় পথ ভাল প্যাকেজ ইনস্টল করার পরে কাজ বলে মনে হয় Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.0 প্রথমত

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

একটি নতুন প্রকল্পের সাথে চেষ্টা করুন এবং পার্থক্যগুলির তুলনা করুন।


1
মূল মুহূর্তটি হ'ল মাইক্রোসফ্টের যথাযথ সংস্করণ পুনরায় ইনস্টল করা spএএসপনেটকোর.এমভিসি। নিউটসনফটজসন কোনও সংস্করণ এবং সতর্কতা ছাড়াই এই প্যাকেজটি বাক্সের নীচে উপলব্ধ বলে আমি সংস্করণটির জন্য মনোযোগ দিইনি! উত্তরের জন্য ধন্যবাদ ! আমার প্রত্যাশা অনুযায়ী সবকিছুই ঠিক কাজ করে!
নজর পাইলিপ

1
সিস্টেম জসনের উন্নত পার্ফ দিয়ে, আমাদের নিউটনসফটজসন ব্যবহার করতে হবে তা কি ভুল নয়? : /
মারেক আরবানউইচজ

40

। নেট কোর ৩.১ প্যাকেজটি মাইক্রোসফ্ট.এএসপনেটকোর.এমভিসি.নিউভটনসফটজসন ইনস্টল করুন

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

এটিও কাজ করে। তবে যেমনটি আপনি উল্লেখ করেছেন, এর সাথে আপনাকে সমস্ত মডেল আপডেট করতে হবে, আমি পরিষেবাগুলি পছন্দ করি .এডডকন্ট্রোলার () Add
নান্থরূপে

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

কারণ প্রথমে আমাদের সমস্ত মডেলের চক্রীয় উল্লেখ থাকতে পারে তার জন্য গুণকটি যুক্ত করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.