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


223

নিম্নলিখিত ব্লগে: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-de વિકાસment-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ক্লাসে কোনও সম্পত্তি সংজ্ঞা দেওয়ার সময় ব্যবহারের উদ্দেশ্য কী ? এর কী প্রভাব আছে?


9
আপনি কি সি # তে 'ভার্চুয়াল' কীওয়ার্ডের সাধারণ উদ্দেশ্য বুঝতে জিজ্ঞাসা করছেন বা এটি কীভাবে সুনির্দিষ্টভাবে সত্তা ফ্রেমওয়ার্কের সাথে সম্পর্কিত?
এমব্যাবকক

2
@ এমব্যাবকক: আমি জিজ্ঞাসা করছি যে এটি সম্পত্তিগুলির সাথে সম্পর্কিত কারণটি কী, কারণ আমি এর আগে কখনও দেখিনি।
গ্যারি জোনস

1
যদি আপনি ভার্চুয়াল কীওয়ার্ড পদ্ধতিগুলিতে পলিমারফিজমকে কীভাবে প্রভাবিত করে তা সম্পর্কে জানেন তবে এটি বৈশিষ্ট্যের ক্ষেত্রে একই।
এমব্যাবকক

19
@ এমব্যাবকক: আমি কীভাবে এটি আরও সুস্পষ্ট করে তুলতে পারি? প্রশ্নের শিরোনাম "ক্লাসে সম্পত্তিগুলির জন্য 'ভার্চুয়াল' কেন ব্যবহার করবেন?"
গ্যারি জোন্স

2
@ গ্যারি - গিটার / সেটার বৈশিষ্ট্যগুলি বাস্তবে পদ্ধতিতে সঙ্কলিত হয়। সুতরাং তারা 'পাবলিক ভার্চুয়াল ডিনার' এর মতো traditionalতিহ্যগত শ্রেণির ক্ষেত্র নয়;
শান প্লৌরেড

উত্তর:


248

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

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

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

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

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

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

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

ক্ষেত্র নয় এবং এ জাতীয় হিসাবে চিন্তা করা উচিত নয়। এগুলিকে গেটরস এবং সেটটার বলা হয় এবং সংকলনের সময় এগুলি পদ্ধতিতে রূপান্তরিত হয়।

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

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

 public virtual ICollection<RSVP> RSVPs;

2
'চারপাশে একটি প্রক্সি তৈরি' বলতে কী বোঝ? আসলে এখানে কি চলছে?
গ্যারি জোন্স

2
হাই গ্যারি, "আশেপাশে একটি প্রক্সি তৈরি করুন" দ্বারা আমি কী বোঝাতে চাইছি তা স্পষ্ট করতে আমি আমার উত্তরটি সংশোধন করেছি। আশা করি যে কিছুটা সাহায্য করবে।
শান প্লুরডে

2
"বৈশিষ্ট্যগুলি ... সম্পত্তি নয়" বলাটি বেশ অস্বাস্থ্যকর। সমস্ত সম্পত্তি গেটর এবং / বা সেটার পদ্ধতি হিসাবে প্রয়োগ করা হয়, সুতরাং "এই সম্পত্তিটি আসলে সম্পত্তি হিসাবে নয় এবং প্রাপ্তকারী পদ্ধতি হিসাবে বিবেচিত হয়" বলার কোনও মানে নেই।
বেন ভয়েগট

1
আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ বেন, আমার পরিষ্কার করা উচিত ছিল যে "সম্পত্তি ক্ষেত্র নয়"। আপনার যদি অন্য কোনও প্রতিক্রিয়া বা প্রশ্ন থাকে তবে আমাকে জানান।
শান প্লুরডে

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

75

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

আপডেট: এটি বর্তমানে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না, তবে যে কেউ জিজ্ঞাসা করা আসল , বর্ণনামূলক প্রশ্নটির সহজ উত্তর খুঁজছেন তাদের জন্য আমি এটি এখানে রেখে দেব ।


23
@ হুচ এটি সঠিক হিসাবে চিহ্নিত করা হয়নি কারণ "সঠিক" বলে মনে করা হয় তা কেবল প্রশ্নের শিরোনামের উপর নির্ভর করে না। আমি কল্পনা করি বেশিরভাগ লোকেরা, আমি এবং ওপি অন্তর্ভুক্ত, প্রথমে virtualসত্তা ফ্রেমওয়ার্কের মাধ্যমে সম্পত্তিগুলির সাথে ডিল করি - এমনকি এটি ওপির শিরোনামেও স্পষ্ট নয়। গৃহীত উত্তরটি তাই কারণ এটি বিষয়গুলির সত্তা ফ্রেমওয়ার্কের দিকে স্পর্শ করে এবং কীভাবে / কেন virtualসেই প্রসঙ্গে সম্পত্তি ব্যবহৃত হয়।
ডন চেইডল

22

আমি ওপিএস হতাশাকে বুঝতে পারি, ভার্চুয়ালের এই ব্যবহারটি সেই টেম্প্লেটেড বিমূর্তির জন্য নয় যে ডিফাক্টো ভার্চুয়াল সংশোধক কার্যকর।

যদি এখনও কেউ এর সাথে লড়াই করে চলেছেন তবে আমি সমাধানগুলি সহজ এবং ন্যূনতম রাখার চেষ্টা করার সাথে সাথে আমার দৃষ্টিভঙ্গিটি উপস্থাপন করব:

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

সত্তা ফ্রেমওয়ার্কে, ভার্চুয়াল নেভিগেশন সম্পত্তি ব্যবহার করা আপনাকে এটিকে এসকিউএল-এ একটি nullable বিদেশী কী এর সমতুল্য হিসাবে চিহ্নিত করতে দেয়। কোনও জিজ্ঞাসা করার সময় আপনার কীড টেবিলটি আগ্রহের সাথে যোগ দেওয়ার প্রয়োজন নেই, তবে আপনার যখন তথ্য প্রয়োজন - এটি চাহিদা-চালিত হয়ে ওঠে।

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

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

আমার কাছে, এটি সর্বদা ওভারলোডেড টেক জার্গন যেমন প্রক্সি, প্রতিনিধি, হ্যান্ডলার এবং এর চেয়ে বেশি ব্যবহার করার চেয়ে বেশি জ্ঞান অর্জন করে। আপনার তৃতীয় বা চতুর্থ প্রোগ্রামিং ল্যাং একবার আঘাত করলে এটি এগুলির সাথে অগোছালো হতে পারে।


14

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

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

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


3

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


0

ভার্চুয়াল কীওয়ার্ডটি কোনও পদ্ধতি, সম্পত্তি, সূচক বা ইভেন্ট ঘোষণার পরিবর্তনের জন্য ব্যবহৃত হয় এবং এটি কোনও উত্পন্ন শ্রেণিতে ওভাররাইড করার অনুমতি দেয়। উদাহরণস্বরূপ, এই পদ্ধতিটি উত্তরাধিকার সূত্রে প্রাপ্ত কোনও শ্রেণীর দ্বারা ওভাররাইড করা যেতে পারে:

public virtual double Area() 
{
    return x * y;
}

আপনি স্থির, বিমূর্ত, ব্যক্তিগত, বা ওভাররাইড সংশোধকগুলির সাহায্যে ভার্চুয়াল সংশোধক ব্যবহার করতে পারবেন না। নিম্নলিখিত উদাহরণটি ভার্চুয়াল সম্পত্তি দেখায়:

class MyBaseClass
{
    // virtual auto-implemented property. Overrides can only
    // provide specialized behavior if they implement get and set accessors.
    public virtual string Name { get; set; }

    // ordinary virtual property with backing field
    private int num;
    public virtual int Number
    {
        get { return num; }
        set { num = value; }
    }
}


class MyDerivedClass : MyBaseClass
{
    private string name;

    // Override auto-implemented property with ordinary property
    // to provide specialized accessor behavior.
    public override string Name
    {
        get
        {
            return name;
        }
        set
        {
            if (value != String.Empty)
            {
                name = value;
            }
            else
            {
                name = "Unknown";
            }
        }
    }
}

এটি সম্পূর্ণ বিষয়বস্তু ছাড়াই।
ইরু

0

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

ডিফল্টরূপে, কোনও শ্রেণীর সদস্যগুলি অ-ভার্চুয়াল এবং স্ট্যাটিক, বিমূর্ত, ব্যক্তিগত, বা ওভাররাইড সংশোধক হিসাবে চিহ্নিত করা যায় না।

উদাহরণ আসুন বিবেচনা ToString () পদ্ধতি System.Object । কারণ এই পদ্ধতিটি সিস্টেমের সদস্য b অবজেক্টটি এটি সমস্ত শ্রেণিতে উত্তরাধিকার সূত্রে প্রাপ্ত এবং তাদের সকলকে টসস্ট্রিং () পদ্ধতি সরবরাহ করবে।

namespace VirtualMembersArticle
{
    public class Company
    {
        public string Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Company company = new Company() { Name = "Microsoft" };
            Console.WriteLine($"{company.ToString()}");
            Console.ReadLine();
        }   
    }
}

পূর্ববর্তী কোডের আউটপুট হল:

VirtualMembersArticle.Company

আসুন বিবেচনা করুন যে আমরা আমাদের কোম্পানীর ক্লাসে সিস্টেম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত উত্তোলন () পদ্ধতির মানক আচরণটি পরিবর্তন করতে চাই। এই লক্ষ্য অর্জনে ওভাররাইড কীওয়ার্ডটি সেই পদ্ধতির আরেকটি বাস্তবায়ন ঘোষণা করার জন্য যথেষ্ট।

public class Company
{
    ...
    public override string ToString()
    {
        return $"Name: {this.Name}";
    }         
}

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

Name: Microsoft

আসলে, যদি আপনি সিস্টেমটি পরীক্ষা করেন b অবজেক্ট ক্লাসটি আপনি দেখতে পাবেন যে পদ্ধতিটি ভার্চুয়াল হিসাবে চিহ্নিত হয়েছে marked

namespace System
{
    [NullableContextAttribute(2)]
    public class Object
    {
        ....
        public virtual string? ToString();
        ....
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.