2008-11-19 12 views
13

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

इसके अलावा, मैं अपने इकाई अन्य संस्थाओं से जानकारी के आधार पर के लिए सामान्य मानों लेकिन जब मुझे पता है entitiy डेटाबेस में प्रविष्टि के लिए instanced है यह केवल करना चाहते हैं। मैं उस वस्तु के बीच का अंतर कैसे बता सकता हूं और ऑब्जेक्ट को इंस्टॉलेशन किया जा रहा है क्योंकि यह मौजूदा डेटा के आधार पर पॉप्युलेट होने वाला है? क्या मुझे पता होना चाहिए? क्या वह व्यापारिक तर्क है जो मेरी इकाई व्यापार तर्क के बाहर होना चाहिए?

यदि ऐसा है, तो क्या मुझे इन सभी इकाइयों को लपेटने के लिए नियंत्रक कक्षाएं डिजाइन करनी चाहिए? मेरी चिंता यह है कि यदि मैं एक इकाई वापस भेजता हूं, तो मैं चाहता हूं कि ग्राहक गुणों तक पहुंच प्राप्त करे, लेकिन मैं मान्यताओं पर कड़े नियंत्रण को बनाए रखना चाहता हूं कि वे कैसे सेट हैं, डिफॉल्ट किए गए हैं। आदि। उदाहरण के लिए मैंने संदर्भ संदर्भ देखा है, जो मेरे ईमानदार आंशिक वर्ग सत्यापन के बाहर है, है ना?

बीटीडब्लू, मैंने ईएफपीको एडाप्टर को देखा और मेरे जीवन के लिए यह निर्धारित नहीं कर सकता कि मेरे पीओसीओ कक्षा के भीतर से सूचियों को कैसे पॉप्युलेट करना है ... किसी को पता है कि मैं ईएफपीको कक्षा से संदर्भ कैसे प्राप्त करूं?

उत्तर

0

आपके पहले प्रश्न के बारे में, मैं केवल व्यापार तर्क के रूप में संगठनों में परिवर्तनों को लागू करता हूं। उदाहरण के लिए, यदि आप कई छात्र के साथ एक शिक्षक वर्ग जोड़ने के लिए, छात्रों की तरह

aTeacher.Students.Add(new Student) 

बजाय नहीं जोड़ते हैं, एक AddStudent विधि

public Student AddNewStudent(string name, string studentID) 
{ 

    Student s = new Student(name, studentID); 
    s.Teacher = this; // changes the association 
    return s; 
} 

इस तरह आप जब संघों बदल रहे हैं पर पूरा नियंत्रण है बनाएँ। बेशक यह है कि एक और प्रोग्रामर को सीधे छात्र जोड़ने से क्या रोकता है? छात्र पक्ष पर, आप शिक्षक सेटर को निजी में सेट कर सकते हैं (और एक शिक्षक या इसी तरह स्वीकार करने के लिए कन्स्ट्रक्टर को बदल सकते हैं)। शिक्षक पक्ष पर, छात्र संग्रह को गैर-सम्मिलित करने के लिए कैसे करें? मैं निश्चित नहीं हूं ... शायद इसे एक कस्टम संग्रह में बदल रहा है जो आवेषण स्वीकार नहीं करता है।

आपके प्रश्न के दूसरे भाग के बारे में, आप शायद OnVarNameChanging ईवेंट का उपयोग कर सकते हैं। यदि EntityState 'नया' है तो आप अपने तर्क को लागू कर सकते हैं जो वास्तविक मान प्राप्त करता है।

एक ऐसी घटना भी है जो आपके द्वारा परिवर्तनों को सहेजने पर आग लगती है (ऑनसेविंग चेंज?) जिसे आप यह निर्धारित करने के लिए उपयोग कर सकते हैं कि कौन सी ऑब्जेक्ट नई हैं और कुछ मान सेट करें।

लेकिन शायद सबसे आसान समाधान हमेशा कन्स्ट्रक्टर में डिफ़ॉल्ट सेट करना है और डीबी से डेटा लोड होने पर वे ओवरराइट हो जाएंगे।

गुड लक

0

एक कारखाने है कि आप की तरह अपनी जरूरत पर निर्भर करता है के लिए उदाहरणों का उत्पादन बनाएँ:

getStudent(String studentName, long studentId, Teacher teacher) { 
    return new Student(studentName, studentId); 
} 

getStudentForDBInseration(String studentName, long studentId, Teacher teacher) { 
    Student student = getStudent(studentName, studentId); 
    student = teacher; 
    //some entity frameworks need the student to be in the teachers student list 
    //so you might need to add the student to the teachers student list 
    teacher.addStudent(student); 
} 
0

यह एक गंभीर एक AssociationChanging (कि CancelEventArgs से विरासत) घटना नहीं होने कमी है।

यह मुझे भी परेशान बहुत ज्यादा है, इसलिए मैं इस माइक्रोसॉफ्ट कनेक्ट करने के लिए Please vote here!

सूचना दी और btw, मैं भी लगता है कि यह भी बेवकूफ कि PropertyChangingEventArgs CancelEventArgs वारिस नहीं है, के बाद से एक अपवाद के साथ रद्द है हमेशा के अलावा सुरुचिपूर्ण समाधान नहीं, अपवादों को फेंकने से ऑनप्रॉपर्टी चंगिंगएवेंट को कॉल करने से अधिक प्रदर्शन की लागत होती है, फिर लौटाए गए ई। कैंसल की जांच करें, तो क्या यह प्रॉपर्टी चेंजिंगवेन्ट को बढ़ाने से भी कम खर्च करता है, जिसे आप उन्हें दोनों कहते हैं।
ई-कैंसल को सही के रूप में चिह्नित करने के बजाय वैसे भी हैंडलर पर एक अपवाद फेंक दिया जा सकता है, जो अपवाद के रास्ते पर जाने का आग्रह करते हैं। Vote Here

+1

PropertyChangingEventArgs का CancelEventArgs से कोई संबंध नहीं है। उनके पास कई बार अलग-अलग उद्देश्यों के लिए विशेष रूप से उपयोग करने की आवश्यकता होती है। विरासत को मजबूर करने के लिए अनियंत्रित जटिलता और निराशा होगी (कसकर उन्हें एक साथ जोड़ना)। PropertyChangingEvent और PropertyChangedEvent है, और मेरा मानना ​​है कि वे उन कार्यक्षमताओं को संतुष्ट करते हैं जिन्हें आप चाहते हैं बिना परिवर्तन किए हैं (उल्लेख नहीं है, जो .NET 1.1 को .NET 4.0 संगतता को तोड़ देगा)। – TamusJRoyce

+0

@TamusJRoyce, ठीक है, मैं सहमत हूं, इसे 'CancelEventArgs' से प्राप्त नहीं होना चाहिए, लेकिन मुझे यह करना चाहिए कि मेरा अन्य अनुरोध उम्मीदवार मूल्य प्रदान करता है (जो इसे प्राप्त करने का आसान तरीका है महत्वपूर्ण विधि विशेषताओं को एक महत्वपूर्ण के साथ प्राप्त करना प्रदर्शन लागत की मात्रा)। – Shimmy

0

शायद आपके प्रश्न का उत्तर या एडीबी के उत्तर पर विस्तार करने के लिए आप ऑब्जेक्टस्टेटमैनेजर.GetObjectStateEntry को संस्थाओं की स्थिति ढूंढने और अपना कस्टम डिफ़ॉल्ट तर्क लिखने के लिए कर सकते हैं।

SaveChanges उस संदर्भ पर विधि है जिसका आप उपयोग कर सकते हैं, या सेविंग चेंज वह घटना है जो SaveChanges कहलाता है।

आप SaveChanges और केवल कॉल base.SaveChanges ओवरराइड यदि आप परिवर्तन

वहाँ भी संदर्भ के लिए एक ObjectMaterialized घटना है निरस्त करने के लिए नहीं करना चाहते हैं कर सकते हैं।

दो आप एक ही स्थान में अपने सभी मान्यता और निर्माण कोड छड़ी कर सकते हैं, जो उचित अगर वे जटिल हैं और अन्य वस्तुओं आदि के मूल्यों में शामिल हो सकता है के बीच ..

2

यह एक टिप्पणी मैं चला गया के जवाब में है । उम्मीद है कि यह आपके प्रश्न, शिमी का जवाब देता है। बस टिप्पणी करें, और यदि मैं आपके प्रश्न का उत्तर नहीं देता तो मैं इसे छोटा कर दूंगा या हटा दूंगा।

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

और इससे पहले कि आप इस संपत्ति के लिए मूल्य निर्धारित करें, आपको PropertyChangingEventArgs कन्स्ट्रक्टर में संपत्ति के नाम का उपयोग करके, NotifyPropertyChanging.PropertyChanging ईवेंट को बढ़ाने की आवश्यकता होगी।

और इस मूल्य को सेट करने के बाद आपको NofityPropertyChanged.PropertyChanged ईवेंट, फिर से संपत्ति के नाम का उपयोग करके संपत्तिChangedEventArgs कन्स्ट्रक्टर में उठाया जा रहा है।

फिर आपको PropertyChanging और PropertyChanged ईवेंट को संभालना होगा। PropertyChanging ईवेंट में, आपको मान को कैश करने की आवश्यकता है। प्रॉपर्टी चेंजेड इवेंट में, आप एक अपवाद की तुलना और फेंक सकते हैं।

संपत्तिChanging/PropertyChanged ईवेंट तर्क से संपत्ति प्राप्त करने के लिए, आपको रिलेक्शन का उपयोग करने की आवश्यकता है।

// PropertyName is the key, and the PropertyValue is the value. 
Dictionary <string, object> propertyDict = new Dictionary<object, object>(); 

    // Convert this function prototype to C# from VBNet. I like how Handles is descriptive. 
    Public Sub PropertyChanging(sender As object, e As PropertyChangingEventArgs) Handles Foo.PropertyChanging 
    { 
     if (sender == null || preventRecursion) 
     { 
     return; 
     } // End if 

     Type senderType = sender.GetType(); 
     PropertyInfo info = senderType.GetProperty(e.PropertyName); 
     object propertyValue = info.GetValue(sender, null); 

     // Change this so it checks if e.PropertyName already exists. 
     propertyDict.Add(e.PropertyName, propertyValue); 
    } // End PropertyChanging() Event 

    // Convert this function prototype to C# from VBNet. I like how Handles is descriptive. 
    Public Sub PropertyChanged(sender As object, e As PropertyChangedEventArgs) Handles Foo.PropertyChanged 
    { 
     if (sender == null || preventRecursion) 
     { 
     return; 
     } // End if 

     Type senderType = sender.GetType(); 
     PropertyInfo info = senderType.GetProperty(e.PropertyName); 
     object propertyValue = info.GetValue(sender, null); 

     // Change this so it makes sure e.PropertyName exists. 
     object oldValue = propertyDict(e.PropertyName); 
     object newValue = propertyValue; 

     // No longer needed. 
     propertyDict.Remove(e.PropertyName); 

     if (/* some condition */) 
     { 
     try { 
      preventRecursion = true; 
      info.SetValue(oldValue, null); 
      Throw New Exception(); 
     } finally { 
      preventRecursion = false; 
     } // End try 
     } // End if 
    } // End PropertyChanging() Event 

ध्यान दें कि मैं प्रीवेन्ट रेक्यूशन का उपयोग कैसे कर रहा हूं, जो एक बुलियन है जिसे मैं इन तरीकों से ऊपर जोड़ना भूल गया? जब आप संपत्ति को अपने पिछले मूल्य पर रीसेट करते हैं, तो इन घटनाओं को याद किया जाएगा।

tl; डॉ

अब आप एक ही घटना है जो INotifyPropertyChanged से विरासत है, लेकिन एक तर्क है जो एक वस्तु पिछले मान के साथ-साथ प्रॉपर्टी नाम का प्रतिनिधित्व रखती है का उपयोग करता है प्राप्त कर सकते हैं।और इससे घटनाओं की संख्या कम हो जाएगी, समान कार्यक्षमता हो सकती है, और इनोटिफ़ाईप्रॉपर्टी चेंज के साथ पिछड़ा संगतता हो सकती है।

लेकिन यदि आप संपत्ति सेट होने से पहले कुछ भी संभालना चाहते हैं (कहें कि संपत्ति एक अपरिवर्तनीय परिवर्तन करता है या आपको उस चर को सेट करने से पहले अन्य गुणों को सेट करने की आवश्यकता है, अन्यथा एक अपवाद फेंक दिया जाएगा) आप सक्षम नहीं होंगे वो करें।

कुल मिलाकर, यह विधि चीजों को करने का एक बहुत पुराना तरीका है। मैं पोकर विलायन के जवाब लेता हूं और इसमें अमान्य डेटा दर्ज किया जा सकता है। लेकिन डेटाबेस को सहेजने की अनुमति नहीं है।

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

फिर आप सत्यापन को नियंत्रित करने के लिए IsValid को बाध्य कर सकते हैं, और अमान्य डेटा दर्ज होने पर वे लाल बबल प्रदर्शित करेंगे। या आप केवल IsValid सत्यापन स्वयं लागू कर सकते हैं। लेकिन यदि IsValid गलत है, तो SaveChanges ईवेंट को सहेजना रद्द करना होगा।

बीटीडब्ल्यू। प्रदान किया गया कोड संकलित नहीं होगा और केवल छद्म कोड होगा (वीबी और सी # मिश्रण)। लेकिन मेरा मानना ​​है कि यह अकेले सी # की तुलना में अधिक वर्णनात्मक है - यह दिखा रहा है कि वास्तव में क्या किया जा रहा है।

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