2013-02-05 15 views
10

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

मैं किसी भी डब्ल्यूसीएफ क्लाइंट तर्क को संस्थाओं के भीतर नहीं रखना पसंद करता हूं। मैं इस तर्क को रिपोजिटरी कोड (डीबीकॉन्टेक्स्ट, डीबीसेट, इत्यादि) में रखना पसंद करूंगा।

तो डेटाबेस से उत्पाद प्रविष्टि को पुनर्प्राप्त करने के ठीक बाद एंटीटी फ्रेमवर्क (या अवरोध) में हुक करने की तकनीक है? मुझे नोट करना चाहिए कि उत्पाद इकाई अन्य संस्थाओं पर एक नेविगेशन संपत्ति के रूप में दिखाई देती है। यदि कोई हुक या अवरोध संभव है तो इसका अर्थ यह है कि मैं डेटाबेस से उत्पाद इकाई लोड करने के तुरंत बाद एसओएपी सेवा से डेटा अनुबंध पुनर्प्राप्त कर सकता हूं। मेरी परियोजना के लिए लाभ डब्ल्यूसीएफ क्लाइंट पुनर्प्राप्ति कोड को पूरे आवेदन में दोहराने की आवश्यकता नहीं है।

डेटा अनुबंध के लिए आईडीबीसेट को लागू करने के लिए एक विचार था और आईडीबीसेट इसे पुनर्प्राप्त करने के लिए जिम्मेदार होगा। और फिर किसी भी तरह उत्पाद इकाई पर इसकी नेविगेशन संपत्ति को सोचने में ईएफ को चालित करें। लेकिन मुझे यकीन नहीं था कि डेटाबेस डीबीसेट को एक ही डीबीसीएन्टेक्स्ट के भीतर गैर-डेटाबेस आईडीबीसेट के साथ मिश्रित किया जा सकता है। और यह भी सवाल - आईडीएफसेट इम्प्लांटेशन से नेविगेशन प्रॉपर्टी को पुनः प्राप्त करने के लिए ईएफ को कैसे पता चलेगा? मैं यह जानना चाहूंगा कि इसमें समय निवेश करने से पहले यह विचार संभव है या नहीं। मैं यह भी जानना चाहूंगा कि कहां देखना शुरू करना है।

कृपया ध्यान दें कि मैं 10 वर्षों से .NET के साथ काम कर रहा हूं लेकिन यह ईएफ 5 सामान अभी भी मेरे लिए अपेक्षाकृत नया है।

अग्रिम धन्यवाद।

-Sam

उत्तर

17

आज मैं इकाई की रूपरेखा है कि मैं के लिए क्या देख रहा हूँ हो रहा है में एक घटना पाया। ObjectContext.ObjectMaterialized Event। जाहिर है, डीबीकॉन्टेक्स्ट IObjectContextAdapter लागू करता है जो ऑब्जेक्ट को ऑब्जेक्ट कॉन्टेक्स्ट का खुलासा करता है। वहां से मैं ऑब्जेक्ट मटेरियलाइज्ड इवेंट की सदस्यता ले सकता हूं।

MSDN पुस्तकें: तब होता है जब एक नई इकाई वस्तु एक प्रश्न या लोड आपरेशन के भाग के रूप डेटा स्रोत में डेटा से बनाया जाता है।

निम्नलिखित कोड दर्शाता है कि कैसे मैं मेरी समस्या है, जिसमें मेरी प्राथमिकताओं में से एक WCF क्लाइंट अभिगम तर्क जगह एक केंद्रीय बिंदु है करने के लिए था हल करने के लिए ObjectMaterialized घटना का इस्तेमाल किया।

// seperate assembly - does not use Domain.Repositories assembly 
namespace Domain.Models 
{ 
    // the data contract 
    [DataContract] 
    public class ProductInventoryState 
    { 
     [DataMember] 
     public int StockStatus { get; set; } 

     [DataMember] 
     public IEnumerable<String> SerialNumbers { get; set; } 

     // etc.... 
    } 

    // the entity 
    public class Product 
    { 
     public Guid Key { get; set; } 
     public string ProductCode { get; set; } 
     public ProductInventoryState InventoryState { get; set; } 
     // etc.... 
    } 
} 

// seperate assembly - uses Domain.Models assembly 
namespace Domain.Repositories 
{ 
    public class MainRepository : DbContext 
    { 
     public MainRepository() 
     { 
      ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += ObjectContext_ObjectMaterialized; 
     } 

     protected void ObjectContext_ObjectMaterialized(object sender, ObjectMaterializedEventArgs e) 
     { 
      if (e.Entity == null) 
       return; 

      if (e.Entity is Product) 
      { 
       Product product = (Product)e.Entity; 

       // retrieve ProductInventoryState from 3rd party SOAP API 
       using (ThirdPartyInventorySystemClient client = new ThirdPartyInventorySystemClient()) 
       { 
        // use ProductCode to retrieve the data contract 
        product.InventoryState = client.GetInventoryState(product.ProductCode); 
       } 
      } 
     }  
    } 
} 
+0

हां, यह घटना सेविंग चेंज के रूप में है। लेकिन एक त्वरित एफवाईआई: अगर अनुमानों का उपयोग कर वे संदर्भ में खत्म नहीं होते हैं। विभिन्न मर्जऑप्शन के साथ क्वेरी करना भी संभव है। तो सावधान रहें कि सभी ईएफ कॉल नतीजे ऑब्जेक्ट कॉन्टेक्स्ट में एक पूर्ण ऑब्जेक्ट को रखा/विलय नहीं किया गया है। –

+0

अभी तक मेरा समाधान मेरे लिए काम कर रहा है ... अब तक। हां यह सच है - अनुमानों के लिए एक इकाई का पुनर्गठन नहीं किया जाता है, क्योंकि मेरे मामले में एक व्यापार बंद नहीं है क्योंकि ग्राहक कोड केवल उत्पाद इकाई का संदर्भ देना चाहता है। मर्जऑप्शन को प्रभावित करने के लिए एक प्रश्न पर, यह समझ में आता है। मुझे यह देखने के लिए पहले हाथ मिलना होगा कि क्या MergeOptions एक समस्या प्रस्तुत करता है। रहो रहो ... मैं इस धागे को उस पर अपडेट करूंगा। –

1

1.) आप अपनी खुद की एफई प्रदाता लिख ​​सकते हैं (लेकिन यह कोई छोटी काम है)

2.) आप संदर्भ के लिए आइटम संलग्न कर सकते हैं, लेकिन उन्हें नहीं बचा।

इकाई.स्टेट को सेट करने के बाद संशोधित नहीं किया जा सकता है। परिवर्तनों को सहेजने से पहले आप संदर्भ से ऐसी प्रविष्टियों को भी हटा सकते हैं

3) आप एक भंडार चिह्न लिख सकते हैं जो ईएफ की जांच करता है और स्थान 2 की जांच करता है और परिणाम को जोड़ता है।

नेविगेशन गुणों के प्रश्न पर। मुद्दों से बचने के लिए आपको इन्हें बहुत सावधानी से निर्दिष्ट करने की आवश्यकता होगी। आलसी लोड नहीं किया गया है या यहां तक ​​कि मॉडलिंग भी नहीं है।

मैं व्यक्तिगत रूप से कोशिश नहीं करता और मिश्रण नहीं करता।
आप कुछ गुणों को अनदेखा करने के लिए ईएफ बता सकते हैं। तो आपके पास एक अच्छा मूल पोको हो सकता है, लेकिन केवल डीबी पर मौजूद बिट्स का मॉडल करें।

पीओसीओ बाकी को इकट्ठा करेगा।

मैं संदर्भ/डीबीसेट पर कुंजी विधियों पर कार्य करने के लिए स्वयं के साथ एक फासीड का उपयोग करता हूं। तो मैं संलग्नक, प्राप्त, सहेजने आदि पर घटनाओं को ट्रिगर कर सकता हूं।

सौभाग्य