6

में ईएफ 6 और ईएफ 4.1 के बीच का अंतर मैं इकाई फ्रेमवर्क के लिए शुरुआत कर रहा हूं।फ़ाइलों में पदानुक्रम

मैं ध्यान दें कि जब मैं EF6 with Visual studio 2013 का उपयोग करें: मैं इस टिप्पणी के साथ .Designer.cs खाली फ़ाइल है

:

// T4 code generation is enabled for model 'C:\Users\Luka\Desktop\Test\EF-db2008\AdventureWorks\AdventureWorksLib\AdventureWorksLib\AWLTModel.edmx'. 
    // To enable legacy code generation, change the value of the 'Code Generation Strategy' designer 
    // property to 'Legacy ObjectContext'. This property is available in the Properties Window when the model 
    // is open in the designer. 

    // If no context and entity classes have been generated, it may be because you created an empty model but 
    // have not yet chosen which version of Entity Framework to use. To generate a context class and entity 
    // classes for your model, open the model in the designer, right-click on the designer surface, and 
    // select 'Update Model from Database...', 'Generate Database from Model...', or 'Add Code Generation 
    // Item...'. 

.Context.tt और इस तरह कोड के साथ अपने .Context.cs :

public partial class AWLTEntities : DbContext 
    { 
     public AWLTEntities() 
      : base("name=AWLTEntities") 
     { 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 

     public virtual DbSet<Address> Addresses { get; set; } 
     public virtual DbSet<Customer> Customers { get; set; } 
    } 

और तो .tt फ़ाइल .cs फ़ाइल के साथ फ़ाइल इस तरह Customer.cs

तरह प्रत्येक इकाई कोड के साथ के लिए:

public partial class Customer 
    { 
     public Customer() 
     { 
      this.NameStyle = false; 
      this.CustomerAddresses = new HashSet<CustomerAddress>(); 
      this.Orders = new HashSet<Order>(); 
     } 

     public int CustomerID { get; set; } 
    } 

यह है पूरी तरह से अलग जब मैं EF4.1 with visual studio 2010 उपयोग करते हैं, वहाँ मॉडल के लिए फ़ाइल .Designer.cs के पीछे केवल एक ही कोड है !!


  • कुछ एक मदद कर सके मुझे समझने की क्या के लिए इन सभी फ़ाइलों हैं .Context.tt, .Context.cs, .tt, .cs? और क्या के विभिन्न दो मामलों (EF6,EF4.1) के बीच फ़ाइलों पदानुक्रम में?
  • मैं EF6 में OnPropertyChanging(Value) & OnPropertyChanged() !! मेरी संस्थाओं को मान्य करने के क्यों इन तरीकों अब मौजूद नहीं हैं और कैसे मेरे गुण मान्य करने के लिए यदि वे मौजूद नहीं है नहीं मिल सकता है?

उत्तर

7

तो यह कदम से स्पष्ट कदम बनाने की सुविधा देता है:

  • आप अपने .edmx फ़ाइल, डिजाइनर से बनाए गए या मौजूदा डेटाबेस से उत्पन्न किया गया था जो मिल गया है। लेकिन यह केवल एक एक्सएमएल फ़ाइल है, जिसमें डेटाबेस संरचना के बारे में जानकारी शामिल है जिसका उपयोग किया जाता है - storage scheme, इकाइयों के बारे में जानकारी - conceptual schema और उन दोनों के बीच मैपिंग। इसमें कोई निष्पादन योग्य कोड नहीं है। इस कोड को उत्पन्न करने की जरूरत है।

  • कोड उत्पन्न करने के लिए .edmx फ़ाइल को पार्स किया जाएगा और .cs फ़ाइलें बनाई जाएंगी जिनमें वास्तविक निष्पादन योग्य कोड होगा। 2 तरीकों का इस्तेमाल किया जा सकता है:

    1. जेनरेटर निर्माण में दृश्य स्टूडियो - EntityModelCodeGenerator उपकरण। यह एक विरासत दृष्टिकोण है, जिसका उपयोग पहले किया गया था (आपके मामले में विसौल स्टूडियो 2010 में)। इससे केवल .Designer.cs फ़ाइल उत्पन्न होगी जिसमें सभी कक्षाएं होंगी। लेकिन यह दृष्टिकोण सबसे अच्छा नहीं है - आप अपनी जरूरतों के लिए पीढ़ी की प्रक्रिया को संशोधित नहीं कर सकते (कहें, DataMember जेनरेट कक्षाओं या कुछ अन्य परिवर्तनों में विशेषता जोड़ें)। यही कारण है कि

    2. T4 templates का उपयोग करना बेहतर है। ये .tt एक्सटेंशन वाली फ़ाइलें हैं। वे सभी अपने तर्क को निष्पादित करते हैं जब Run custom tool संदर्भ मेनू में चुना जाता है, या .edmx फ़ाइल बदल दी जाती है। .edmx से ईएफ कोड उत्पन्न करने के लिए उपलब्ध टेम्पलेट्स का एक सेट है, कुछ जानकारी here। और क्योंकि ये केवल नियमित फाइलें हैं, आप उन्हें संशोधित कर सकते हैं (बेहतर संपादक अनुभव tangible T4 extension का उपयोग करने के लिए)। ईएफ here में टी 4 टेम्पलेट्स के उपयोग के बारे में कुछ बुनियादी जानकारी।

आप दृश्य स्टूडियो संस्करण की स्वतंत्र रूप से इन 2 दृष्टिकोणों के बीच चयन कर सकते हैं - बस अपने .edmx फ़ाइल के गुणों में Code generation strategy संपत्ति बदल: यदि Legacy ObjectContext विकल्प है

enter image description here

चुना गया - आपको सिंगल .Designer.cs फ़ाइल के साथ 1-सेंट रास्ता मिलता है। यदि T4 - तो .Designer.cs खाली होगा (टिप्पणियों के साथ कि टी 4 टेम्पलेट्स का उपयोग किया जाता है) और .tt फ़ाइलें प्रयुक्त कोड उत्पन्न करेंगी। इसलिए यदि आपको वीएस 2010 में समान कोड की आवश्यकता है - तो बस Legacy ObjectContext विकल्प का उपयोग करें।

उन दोनों के बीच एक और अंतर यह है कि 1-सेंट विरासत ObjectContext उत्पन्न करता है और EntityObect से प्राप्त इकाइयां उत्पन्न करता है। वे सभी .Designer.cs फ़ाइल में होंगे। लेकिन अब इसकी अनुशंसा नहीं की जाती है (हालांकि आप अभी भी corresponding T4 template प्राप्त कर सकते हैं - इस तरह आपको OnPropertyChanged और OnPropertyChanging वापस मिल जाएगा, क्योंकि वे EntityObect कक्षा के तरीके हैं, हालांकि वे सुरक्षित हैं, इसलिए आपको कुछ रैपर लिखने की आवश्यकता हो सकती है)। लेकिन POCO classes and DbContext template का उपयोग करना बेहतर है - जो आपके मामले में वीएस 2013 का उपयोग किया जाता है। इसके बाद आप .Context.tt.Context.cs उत्पन्न करने के लिए DbContext उत्पन्न करने के साथ DbSets तालिकाओं का प्रतिनिधित्व करते हैं, और .tt फ़ाइल इकाई वर्ग उत्पन्न करने के लिए अलग-अलग .Context.tt प्राप्त करेंगे।और .tt और .cs के बीच पदानुक्रम केवल दिखाता है कि .cs कौन से .tt उत्पन्न हुए थे, जबकि केवल .cs वास्तव में अनुपालन किया जाएगा और आपका ऐप चलाने पर निष्पादित किया जाएगा।

  • और अब OnPropertyChanged के बारे में - बस INotifyPropertyChanged इंटरफेस के एक कार्यान्वयन होना चाहिए। हालांकि ऐसा लगता है कि आप टेम्पलेट का उपयोग कर रहे हैं जो पीओसीओ कक्षाएं उत्पन्न करता है। यह डिफ़ॉल्ट और अनुशंसित विकल्प है, लेकिन INotifyPropertyChanged के कार्यान्वयन के लिए आपको टेम्पलेट को संपादित करने या विजुअल स्टूडियो ऑनलाइन गैलरी से दूसरे को चुनने की आवश्यकता हो सकती है। हालांकि, यह सबसे अच्छा आर्किटेक्चरल समाधान नहीं हो सकता है, क्योंकि कभी-कभी यूआई/बिजनेस लॉजिक के लिए उपयोग की जाने वाली इकाइयों और कक्षाओं को अलग करना बेहतर होता है।
+3

यह भी ध्यान देने योग्य है कि ईडीएमएक्स है ईएफ 7 में जा रहा है। इसलिए इनमें से कोई भी ईएफ 6 के बाद लागू नहीं होगा। – danludwig

+1

हां, लेकिन यह ईएफ 7 में एक अलग धागा के लायक है, एक टिप्पणी नहीं है) लेकिन संक्षेप में - हमारे वर्तमान प्रोजेक्ट पर हम ईएफ 7 में अपग्रेड नहीं कर सकते हैं - हम मौजूदा डेटाबेस और "डीबी से मॉडल अपडेट करें" दृष्टिकोण का उपयोग करते हैं, जो [अच्छी तरह से समर्थित नहीं है] (http://blogs.msdn.com/b/adonet/archive/2014/10/21/ef7-what-does-code -first-केवल-सच-mean.aspx)। उदाहरण के लिए, हमारे पास कस्टम मैपिंग नाम हैं, और अगर हम कोड फर्स्ट के लिए रिवर्स-इंजीनियर का उपयोग करेंगे, तो वे रीसेट हो जाएंगे, और हम अपने सभी कोड में नामकरण नहीं कर सकते - बहुत बड़े रिफैक्टरिंग। और फ़ंक्शन मैपिंग कोड पहले में समर्थित नहीं हैं। –

+1

और मुझे लगता है कि ईएफ 6 के बाद कोई नहीं होगा क्योंकि ईएफ 7 बस [बहुत अधिक भिन्न है] (http://blogs.msdn.com/b/adonet/archive/2014/10/27/ef7-v1- या-v7.aspx), इसलिए हमारे पास अलग-अलग ज़रूरतों के लिए 2 ढांचे भी हो सकते हैं - ईएफ 6 और ईएफ 7. –

3

*.tt फ़ाइलों T4 templates.EDMX file से सी # कोड autogenerate किया जाता है। यह मूल रूप से आपकी संग्रहण योजना, वैचारिक योजना और उनके बीच मैपिंग है। .context.cs आपका DbContext (पूर्व ObjectContext) और अन्य संस्थाएं हैं। कोड उत्पन्न करने के लिए प्रयुक्त उपकरण EntityModelCodeGenerator है जैसा कि .edmx फ़ाइल के गुणों में देखा गया है। तो यह बहुत सीधे आगे है।

OnPropertyChanged प्राप्त करने के लिए EntityObject कक्षा के लिए आप this manual के अनुसार स्व-ट्रैकिंग इकाइयों को आजमा सकते हैं। लेकिन जैसा कि आप देखते हैं कि अब इसकी सलाह नहीं दी गई है ... शायद सभी को आपकी इकाइयों में INotifyPropertyChanged इंटरफेस लागू करने की आवश्यकता होगी (वे partial हैं)। EntityObject प्रॉक्सी कक्षाओं द्वारा प्रतिस्थापित किया गया था। ईएफ उन्हें प्रत्येक इकाई के लिए उत्पन्न करता है (बंद किया जा सकता है)। और वहां एक ट्रैकिंग भी शामिल है। आशा करता हूँ की ये काम करेगा!

अद्यतन। तो आप इसे स्वयं इकाइयों में सत्यापन उत्पन्न करने के लिए उपयोग कर सकते हैं लेकिन यह कुछ तर्क या घटना हैंडलिंग होगा। आमतौर पर इसे "मुक्त" करने के लिए सेवाओं में अलग मॉड्यूल में रखा जाता है। बेशक यह आपके विशिष्ट मामले, आवश्यकताओं पर निर्भर करता है।

+0

एसटीई निश्चित रूप से ऑनप्रॉपर्टी प्राप्त करने के लिए उपयोग नहीं किया जाना चाहिए - टी 4 टेम्पलेट में कुछ कस्टम लाइनें इसे करेंगी। और एसटीई के साथ आपको चेंजट्रैकर और उन सभी भयानक चीजें मिलती हैं जो एन-स्तरीय ऐप्स के लिए उपयोगी हो सकती हैं (जब आपके पास संदर्भ तक पहुंच नहीं है और किसी भी तरह से परिवर्तन ट्रैक करना है), लेकिन इसे लागू किया गया है .... गन्दा है कि अब यह अप्रचलित है। [अन्य तकनीक] (https://ntieref.codeplex.com/) को एन-स्तरीय ईएफ के लिए समर्थन को लागू करने के लिए विकसित किया गया है, लेकिन, एक बार और, यह केवल इनोटिफ़ाईप्रॉपर्टी को लागू करने से कहीं अधिक कठिन कार्य है। –

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