সত্তা ফ্রেমওয়ার্ক: নির্দিষ্ট প্রশ্নের জন্য অলস লোডিং কীভাবে অক্ষম করবেন?


89

সত্তা ফ্রেমওয়ার্ক 6 এ নির্দিষ্ট প্রশ্নের জন্য অলস লোডিং অক্ষম করার কোনও উপায় আছে কি? আমি এটি নিয়মিত ব্যবহার করতে চাই তবে মাঝে মাঝে আমি এটি অক্ষম করতে চাই। আমি তাদের অলস ভার্চুয়াল বৈশিষ্ট্যগুলি ব্যবহার করছি।


20
কনটেক্সট সেট করুন। কনফিগারেশন.লাজিওলয়েডিংএনেবলড = মিথ্যা; আপনি যে ক্যোয়ারি চালাতে চান তার আগে
কার্তিক গণেশন

4
আপনি শুধু মান this.Configuration.LazyLoadingEnabled = false;সেট করতে পারেন, আবার এটি সেট this.Configuration.LazyLoadingEnabled = true;? এছাড়াও, আপনি এটা পড়তে পারেন msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

4
আপনাকে ধন্যবাদ কার্ত্তিকগানেসন এটি আশানুরূপ কাজ করেছিল।
মার্কো আলভেস

@ কার্থিকগানেশন আপনি কি উত্তর হিসাবে নিজের মন্তব্য রাখতে পারেন? এটি সত্যিই ভাল কাজ করছে :)
সম্পথ

4
উত্তর হিসাবে মন্তব্য যোগ করেছেন @ সম্পাথ
কার্তিক গণেশান

উত্তর:


76

আপনি যে এক্সিকিউটটি চালাতে চান তার আগে নিম্নলিখিত কোডটি সেট করুন

context.Configuration.LazyLoadingEnabled = false;

40

আপনি নির্দিষ্ট ক্যোয়ারির জন্য অলস লোডিংটি নিম্নরূপ অক্ষম করতে পারেন:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

21

আমি এখানে কিছু মিস করছি, তবে প্রতিবার কনফিগারেশনটি পরিবর্তনের পরিবর্তে, অন্য যে কোনও পদ্ধতির ব্যবহারের .Include()জন্য কেবল সেই প্রশ্নগুলিতেই ব্যবহার করা যেতে পারে যেখানে আপনি আগ্রহী লোড চান?

ধরুন আমাদের একটি Productক্লাস রয়েছে যার একটি ক্লাসে নেভিগেশন সম্পত্তি রয়েছে Colour, আপনি সম্ভবত এটির Colourজন্য লোড করতে Productপারেন -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

4
আমার জন্য এটি এখানে সেরা উত্তর!
ইয়ান

আপনি যদি কোনও পণ্য অন্তর্ভুক্ত না করে কেবল "পণ্য" আগ্রহী করতে চান তবে এটি সংক্ষিপ্ত হয় falls
ম্যাকান

সুতরাং আপনি তাদের সম্পর্কিত কোনও বস্তু ছাড়াই 'পণ্য' পেতে চান, বা 'তাদের সম্পর্কিত সমস্ত বস্তুর পণ্য'?
প্যারিবার্ড

4
আরও অনেক দরকারী উত্তর। এটি সুনির্দিষ্ট সাব-অর্ডিনেট টেবিলগুলিকে নিয়ন্ত্রণ করে যা ক্যোয়ারী নির্মিত হচ্ছে এমন পয়েন্টে লোড করা হয়। যে কোনও বাস্তব বিশ্বের সমস্যার জন্য এটি হবার উপায় হতে হবে।
রিচার্ড পেথেরাম

4
এটি অন্য উপায়ে কার্যকর ... আপনি যদি এভাবে করেন তবে একজন 'পণ্য' থেকে অন্য সংগ্রহের জন্য অলস লোডিং পেতে পারে। প্রকৃতপক্ষে অলস লোডিংটি অক্ষম করা গ্যারান্টি দিতে আরও কার্যকর যে প্রয়োজনীয় সমস্ত ডেটা আগাম প্রাপ্ত এবং গোপনীয় পারফরম্যান্সের বাধা তৈরি করা এড়ানো avo
ডগ

15

আপনার চিত্রের বৈশিষ্ট্যগুলিতে যান এবং অলস লোডিং এবং এটি অক্ষম করার জন্য মনোনীত একটি সম্পত্তি পান।

আপনি যদি প্রথমে কোড ব্যবহার করছেন তবে আপনার কনফিগারেশনের জায়গায় যান এবং সেখান থেকে এটি অক্ষম করুন:

this.Configuration.LazyLoadingEnabled = false;

6
প্রচুর লোক এই প্রশ্নটি ঘুরে দেখছেন এবং আমি বলতে চাই, লোকেরা এক্সিকিউশন প্ল্যানের দিকে নজর রাখার সাথে প্রশ্নগুলি লিখেন না। আপনার কোডটি ডাটাবেসে কী প্রেরণ করে তা আপনার সর্বদা জানুন বা আপনার কার্য সম্পাদনের সমস্যা হবে। আপনি আসল প্রশ্নটি দেখতে এবং পরীক্ষা করতে লিনক প্যাড বা অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন।
জুয়ান


3

অন্য একটি EF সংস্করণের জন্য আরেকটি অ্যাপোকারাহ (সত্তা ফ্রেমওয়ার্ক 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

কখন contextএকটি হয় ObjectContext, এর মোড়কের কমবেশি কম পূর্বসূচী DbContext,।
গার্ট আর্নল্ড

2

ধরুন আপনার কাছে এটি রয়েছে:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

না করার সুস্পষ্ট সেটিংস থাকা সত্ত্বেও আপনি অলস লোডিংটি পেতে চাইবেন। ফিক্সটি সহজ, এটিকে এটি পরিবর্তন করুন:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.