c# - কেন এন্টি ফ্রেমওয়ার্ক মডেলের সংজ্ঞাগুলিতে ক্লাস বৈশিষ্ট্যের জন্য 'ভার্চুয়াল' ব্যবহার করবেন?




class properties (4)

একটি মডেল ভার্চুয়াল হতে নেভিগেশানিয়াল বৈশিষ্ট্য সংজ্ঞায়িত করা বেশ সাধারণ। যখন একটি ন্যাভিগেশন সম্পত্তি ভার্চুয়াল হিসাবে সংজ্ঞায়িত করা হয়, এটি নির্দিষ্ট এনটিটি ফ্রেমওয়ার্ক কার্যকারিতা সুবিধা নিতে পারে। সবচেয়ে সাধারণ এক অলস লোড হচ্ছে।

অলস লোডিং অনেক ORMs এর একটি সুন্দর বৈশিষ্ট্য কারণ এটি আপনাকে একটি মডেল থেকে গতিশীলভাবে সম্পর্কিত তথ্য অ্যাক্সেস করতে দেয়। এটি অপ্রয়োজনীয়ভাবে অ্যাক্সেস না হওয়া পর্যন্ত সম্পর্কিত তথ্য আনবে না, এইভাবে ডেটাবেস থেকে ডেটা আপ-ফ্রন্ট ক্যোয়ারী হ্রাস করবে।

বই থেকে "এএসপি.নেট এমভিসি 5 বুটস্ট্র্যাপ এবং নকআউট.জেএসএস"

নিচের ব্লগে: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

ব্লগ নিম্নলিখিত কোড নমুনা রয়েছে:

public class Dinner
{
   public int DinnerID { get; set; }
   public string Title { get; set; }
   public DateTime EventDate { get; set; }
   public string Address { get; set; }
   public string HostedBy { get; set; }
   public virtual ICollection<RSVP> RSVPs { get; set; }
}

public class RSVP
{
   public int RsvpID { get; set; }
   public int DinnerID { get; set; }
   public string AttendeeEmail { get; set; }
   public virtual Dinner Dinner { get; set; }
}

ক্লাসে একটি সম্পত্তি সংজ্ঞায়িত যখন virtual ব্যবহার করার উদ্দেশ্য কি? এটা কি প্রভাব আছে?


EF এর প্রসঙ্গে, ভার্চুয়াল হিসাবে একটি সম্পত্তি চিহ্নিত করে EF লোড লোড লোড করার জন্য এটি ব্যবহার করতে দেয়। কাজের জন্য অলস লোডিংয়ের জন্য EF- কে একটি প্রক্সি অবজেক্ট তৈরি করতে হবে যা আপনার ভার্চুয়াল বৈশিষ্ট্যগুলিকে একটি বাস্তবায়ন দ্বারা ওভাররাইড করে যা রেফারেন্সকৃত সত্তাটিকে প্রথম অ্যাক্সেসের সময় লোড করে। যদি আপনি সম্পত্তিটি ভার্চুয়াল হিসাবে চিহ্নিত না করেন তবে অলস লোডিং এর সাথে কাজ করবে না।


এটি এন্টিটি ফ্রেমওয়ার্কটি ভার্চুয়াল সম্পত্তির চারপাশে একটি প্রক্সি তৈরি করতে দেয় যাতে সম্পত্তি অলস লোডিং এবং আরও কার্যকর পরিবর্তন ট্র্যাকিংকে সমর্থন করে। দেখুন কী প্রভাব (গুলি) ভার্চুয়াল কীওয়ার্ডটি এনটিটি ফ্রেমওয়ার্ক 4.1 পোকো কোডে প্রথম থাকতে পারে? আরো পুঙ্খানুপুঙ্খ আলোচনা জন্য।

"চারপাশে একটি প্রক্সি তৈরি করুন" স্পষ্ট করার জন্য সম্পাদনা করুন: "চারপাশে একটি প্রক্সি তৈরি করুন" দ্বারা আমি বিশেষভাবে স্বতন্ত্র ফ্রেমওয়ার্কের বিষয়ে উল্লেখ করছি। অ্যান্টিটি ফ্রেমওয়ার্কের জন্য আপনার ন্যাভিগেশন বৈশিষ্ট্যগুলিকে ভার্চুয়াল হিসাবে চিহ্নিত করতে হবে যাতে অলস লোডিং এবং দক্ষ পরিবর্তন ট্র্যাকিং সমর্থিত হয়। POCO প্রক্সি তৈরির জন্য প্রয়োজনীয়তা দেখুন।
এন্টিটি ফ্রেমওয়ার্কটি এই কার্যকারিতা সমর্থন করার জন্য উত্তরাধিকার ব্যবহার করে, এটি আপনার বেস ক্লাস POCO গুলিতে নির্দিষ্ট বৈশিষ্ট্যের ভার্চুয়াল চিহ্নিত করতে হবে। এটি আক্ষরিকভাবে আপনার POCO প্রকার থেকে উদ্ভূত নতুন ধরনের তৈরি করে। সুতরাং আপনার POCO Entity Framework এর গতিশীলভাবে নির্মিত উপশ্রেণীগুলির জন্য বেস টাইপ হিসাবে কাজ করছে। আমি যে "আমার কাছাকাছি একটি প্রক্সি তৈরি" বোঝানো হয়।

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

যদি আপনি একটি স্বতন্ত্র শ্রেণী তৈরি করতে এবং ভার্চুয়াল রূপে বৈশিষ্ট্যাবলী চিহ্নিত করতে চান এবং কেবলমাত্র নিজের সংস্থায় সেই ক্লাসগুলি ইনস্ট্যান্স ফ্রেমওয়ার্কের বাইরেও সম্পূর্ণরূপে গঠন এবং ব্যবহার করেন তবে আপনার ভার্চুয়াল বৈশিষ্ট্যগুলি আপনার কাছে কোনও লাভ পাবে না নিজের।

বৈশিষ্ট্য ভার্চুয়াল হিসাবে চিহ্নিত করা হবে কেন বর্ণনা করুন

যেমন বৈশিষ্ট্য:

 public ICollection<RSVP> RSVPs { get; set; }

ক্ষেত্র না এবং যেমন হিসাবে চিন্তা করা উচিত নয়। এই getters এবং setters এবং সংকলন সময় বলা হয়, তারা পদ্ধতিতে রূপান্তরিত হয়।

//Internally the code looks more like this:
public ICollection<RSVP> get_RSVPs()
{
    return _RSVPs;
}

public void set_RSVPs(RSVP value)
{
    _RSVPs = value;
}

private RSVP _RSVPs;

এ কারণে তারা এন্টিটি ফ্রেমওয়ার্কে ব্যবহারের জন্য ভার্চুয়াল হিসাবে চিহ্নিত হয়, এটি গতিশীলভাবে নির্মিত ক্লাসগুলিকে অভ্যন্তরীণভাবে তৈরি হওয়া এবং set ফাংশনগুলিকে ওভাররাইড set দেয়। আপনার ন্যাভিগেশন সম্পত্তি গেট্টার / সেটারগুলি আপনার এন্টিটি ফ্রেমওয়ার্ক ব্যবহারের ক্ষেত্রে আপনার জন্য কাজ করছে, তবে এন্টিটি ফ্রেমওয়ার্কটি এখনও সঠিকভাবে কাজ করতে সক্ষম কিনা তা কেবল বৈশিষ্ট্যগুলিতে, পুনঃ কম্পাইল, এবং দেখুন:

 public virtual ICollection<RSVP> RSVPs;

সি # এ virtual কীওয়ার্ড একটি পদ্ধতি বা সম্পত্তিকে শিশু শ্রেণীর দ্বারা ওভাররাইড করা সক্ষম করে। আরও তথ্যের জন্য 'ভার্চুয়াল' শব্দে MSDN ডকুমেন্টেশন পড়ুন

আপডেট: এটি বর্তমানে প্রশ্ন করা প্রশ্নটির উত্তর দিচ্ছে না, তবে আমি যে কেউ এখানে original , অ-বর্ণবাদী প্রশ্ন জিজ্ঞাসা করা সহজ উত্তর খোঁজার জন্য এখানে রেখে দেব।





virtual