2015-07-21 6 views
14

के लिए पैरामीटर रहित कन्स्ट्रक्टर क्यों होना चाहिए, यह मेरी वास्तविक समस्या हल होने के कारण "हम क्यों काम करते हैं" का एक सवाल है, लेकिन मुझे नहीं पता कि क्यों।मेरे पास कोड फर्स्ट/एंटिटी फ्रेमवर्क

मैं अपने CountyRepository अंदर निम्नलिखित कोड के साथ काम कर रहा था:

public IEnumerable<County> GetCounties(string stateAbbr) 
    { 
     using (var db = new AppDbContext()) 
     { 
      State state = (from s in db.States 
         where s.Abbr == stateAbbr 
         select s).First(); 

      return context.Counties.Where(c => c.StateID == state.StateID).ToList(); 
     } 
    } 

AppDbContext मैं ऊपर बनाया एक कस्टम प्रारंभकर्ता करने के लिए जाना होगा:

public class AppDbContextInitializer : DropCreateDatabaseIfModelChanges<AppDbContext> 
{ 
    protected override void Seed(AppDbContext context) 
    { 
     StatesList states = new StatesList(); 
     context.States.AddRange(states); 
     context.Counties.AddRange(new CountiesList(states)); 

     context.SaveChanges(); 
    } 
} 

समस्या, था जब मैं कोड निष्पादित AppDbContext प्रारंभकर्ता में राज्य और काउंटी की जानकारी को सही ढंग से लोड करेगा, लेकिन जब यह काउंटी रिपोजिटरी में वापस आया, तो AppDbContext खाली था और "राज्य में कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं था" के कारण त्रुटि होगी। मैं नहीं चाहता था कि मेरे राज्य ऑब्जेक्ट में पैरामीटर रहित कन्स्ट्रक्टर हो, इसलिए मैंने पूरे दिन देखा कि एपडीबीकॉन्टेक्स काउंटी रिपोजिटरी में क्यों लोड करेगा।

Exception when loading related objects. Entity Framework

यह एक सरल उपाय था: मैं अंत में निम्नलिखित समाधान मिल गया। पैरामीटर रहित कन्स्ट्रक्टर जोड़ें और इसे अप्रचलित चिह्नित करें। मैंने यह किया और यह पूरी तरह से काम किया।

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

क्या कोई बेहतर समाधान है या कम से कम एक स्पष्टीकरण है ताकि मैं भ्रम के बजाय ज्ञान के साथ आगे बढ़ सकूं?

+0

यदि आपकी स्टेट क्लास में एक कस्टम कंस्ट्रक्टर है, तो आपको एक और कन्स्ट्रक्टर भी प्रदान करना होगा (जो पैरामीटर नहीं लेता)। क्यूं कर? .NET के नियम – BKSpurgeon

+1

@BKSpurgeon ठीक है, यह पूरी तरह से सही नहीं है। यदि आपके पास कोई कन्स्ट्रक्टर परिभाषित नहीं है, तो निहित डिफ़ॉल्ट कन्स्ट्रक्टर (पैरामीटर रहित) मौजूद है। यदि आप एक कन्स्ट्रक्टर निर्दिष्ट करते हैं, और पैरामीटर और पैरामीटर दोनों का उपयोग करना चाहते हैं, तो आपको इसे स्पष्ट रूप से निर्दिष्ट करना होगा। – Bartosz

उत्तर

24

एक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए, लेकिन यह आंतरिक या निजी हो सकता है। ref question 3

+0

मुझे नहीं पता था कि यह निजी हो सकता है। धन्यवाद। – Tyddlywink

+0

मैंने अपने पैरामीटर रहित कन्स्ट्रक्टर को निजी रूप से बदल दिए जाने के बाद अपवाद प्राप्त करना शुरू कर दिया। ऐसा लगता है कि परिवर्तन के बाद उस विशेष मॉडल में सभी जटिल प्रकार वापस आ रहे हैं। – Nathan

+0

इस कन्स्ट्रक्टर को इकाई ढांचे से प्रतिबिंब के माध्यम से बुलाया जाता है –

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