8

मैं एफई navigation property should be virtual में याद के रूप में:नेविगेशन संपत्ति वर्चुअल होना चाहिए - ef core में आवश्यक नहीं है?

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 
    public string Tags { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

लेकिन मैं EF Core को देखो और आभासी के रूप में यह दिखाई नहीं देता:

public class Student 
    { 
     public int ID { get; set; } 
     public string LastName { get; set; } 
     public string FirstMidName { get; set; } 
     public DateTime EnrollmentDate { get; set; } 

     public ICollection<Enrollment> Enrollments { get; set; } 
    } 

इसे अब और आवश्यकता नहीं है?

उत्तर

20

virtual किया गया था। यह केवल तभी जरूरी था जब आप आलसी लोडिंग समर्थन चाहते हों।

Lazy loading is not yet supported by EF Core के बाद से, वर्तमान में virtual का कोई विशेष अर्थ नहीं है। यह तब होगा जब (और अगर) वे आलसी लोडिंग समर्थन जोड़ते हैं (ऐसा करने के लिए plan है)।

+0

यदि यह कोई विशेष अर्थ नहीं है, क्यों पाड़ आभासी के साथ हर नौवहन संपत्ति उत्पन्न करता है? –

+0

@CamiloTerevinto बस मामले में? डिफ़ॉल्ट रूप से? यह वास्तव में कोई फर्क नहीं पड़ता। –

+0

सुंदर दिलचस्प, वास्तव में, मुझे पता है कि वे डिफ़ॉल्ट आभासी एफई कोर के लिए, मुझे नहीं लगता है तो –

3

ईएफ कोर में डिफ़ॉल्ट रूप से आलसी लोडिंग को हतोत्साहित करने का मार्ग चुनता है। मुझे यह भी लगता है कि इस सुविधा के बाद भी यह सुविधा लागू नहीं की गई है।

https://github.com/aspnet/EntityFramework/issues/3312

एफई के पिछले संस्करणों आभासी नेविगेशन गुण संबंधित संस्थाओं आलसी लोड करने के लिए अनुमति के साथ

मुझे लगता है कि अब के लिए लोड हो रहा है नेविगेशन गुण केवल साथ .Include(...)

संपादित हासिल किया जा सकता है:

वहाँ जो कोर में समर्थन कर रहे लोडिंग संबंधित संस्थाओं के कई तरीके हैं। आप रुचि रखते हैं: एफई में कभी नहीं आवश्यक https://docs.microsoft.com/en-us/ef/core/querying/related-data

8

यह आवश्यक नहीं किया गया है ...

के अन्य जवाब यहाँ के लिए धन्यवाद, मैं देखता हूँ कि एफई कोर भी लेज़ी लोड हो रहा है का समर्थन नहीं करता ... यह बहुत आभासी कुंजी शब्द है ... कोर में बेकार

लेकिन आम तौर पर:

1. यदि आप अपनी संपत्ति आभासी घोषित:

आपका वर्चुअल संपत्ति (डिफ़ॉल्ट रूप से) अभी लोड नहीं किया जाएगा जब मुख्य उद्देश्य से क्वेरी। यह केवल डेटाबेस से पीछे हट जाएगा यदि आप इसे एक्सेस करने का प्रयास करते हैं, या इसके किसी भी घटक को एक्सेस करते हैं।

और इसे आलसी लोडिंग कहा जाता है।

2. यदि आप इसे गैर आभासी घोषित:

आपकी संपत्ति (डिफ़ॉल्ट रूप से) सही अपने मुख्य इकाई में अन्य सभी संपत्ति के साथ-साथ दूर लोड किया जाएगा। इसका मतलब है कि आपकी संपत्ति एक्सेस करने के लिए तैयार होगी: इसे पहले से ही पुनः प्राप्त कर लिया गया है। इकाई को फिर से डेटाबेस से पूछताछ नहीं करनी होगी क्योंकि आप इस संपत्ति तक पहुंचते हैं।

इसे उत्सुकता से लोडिंग कहा जाता है।

मेरे राय:

अधिक अक्सर मैं बेसब्री से (गैर आभासी) क्योंकि ज्यादातर समय, मैं हर इकाई के हर संपत्ति की जरूरत है वापस (में तेजी से क्वेरी करने के लिए बिना साथ प्रयोग की जाने वाली लोड हो रहा है चुन

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

आशा यह स्पष्ट था ...

Exemples:

मैं कहाँ आभासी (बेसब्री) का उपयोग नहीं होगा:

:

foreach(var line in query) 
{ 
    var v = line.NotVirtual; // I access the property for every line 
} 

मैं कहाँ आभासी या आलसी लोड हो रहा है प्रयोग करेंगे

foreach(var line in query) 
{ 
    if(line.ID == 509)  // because of this condition 
    var v = line.Virtual; // I access the property only once in a while 
} 

एक आखिरी बात:

यदि आप डेटाबेस की 1 000 से अधिक पंक्तियों से पूछताछ नहीं करते हैं, तो जो भी आप चुनते हैं उसका कोई बड़ा प्रभाव नहीं पड़ेगा। इसके अलावा, आप इन संपत्ति आभासी घोषणा कर सकते हैं और आप दूसरी तरह के आसपास का परीक्षण करना चाहते हैं, तो आप सिर्फ यह करने के लिए है:

context.LazyLoadingEnabled = false; 

यह आभासी प्रभाव रद्द हो जाएगा।

संपादित

एफई के नए संस्करणों के लिए:

WhateverEntities db = new WhateverEntities() 
db.Configuration.LazyLoadingEnabled = false; 
1

अद्यतन: आलसी लोड हो रहा है की एक आरंभिक कार्यान्वयन, एफई कोर 2.1 के लिए योजना बनाई है, की आवश्यकता होगी नेविगेशन गुण आभासी घोषित किया जाना है। https://github.com/aspnet/EntityFrameworkCore/issues/10787 देखें, और आमतौर पर आलसी लोडिंग पर प्रगति को ट्रैक करने के लिए, https://github.com/aspnet/EntityFrameworkCore/issues/10509 देखें।

संबंधित मुद्दे