2009-01-31 7 views
15

मैं इस कोड है:LINQ InsertOnSubmit: NullReferenceException

using DC = MV6DataContext; 
using MV6; // Business Logic Layer 
// ... 

public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString); 
IP ip = new IP(Request.UserHostAddress); 
dc.IPs.InsertOnSubmit(ip); 
dc.SubmitChanges(); 

// in Business Logic layer: 
public class IP : DC.IP { 
    public IP(string address) { ... } 
} 

InsertOnSubmit (आईपी) के लिए प्रयास कर पर, मैंने प्राप्त एक NullReferenceException (ऑब्जेक्ट संदर्भ एक वस्तु का एक उदाहरण के लिए सेट नहीं)। डीसी शून्य नहीं है; आईपी ​​और आईपी के सभी गुण शून्य नहीं हैं; हालांकि कुछ खाली हैं।

VS2008 मुझे InsertOnSubmit में कदम नहीं दूँगा, तो मैं जानते हुए भी क्या विशेष रूप से रिक्त है जब मूल्यांकन किया जा रहा का कोई रास्ता नहीं है। क्या देता है?

नोट: मैं जाँच की है, और FK संबंधों द्वारा बनाई गई सभी Linq.EntitySets वर्तमान और गैर-शून्य कर रहे हैं।

+0

की संभावित डुप्लिकेट (http: // stackoverflow। com/प्रश्न/4660142/क्या-है-एक NullReferenceException और कैसे करते हैं-ए-ठीक-मैं टी) – Nasreddine

+0

@Nasreddine: मुझे नहीं लगता कि 200 9 में एक प्रश्न पूछा गया था कि 2011 में पूछे गए प्रश्न का डुप्लिकेट संभवतः हो सकता है। – tsilb

उत्तर

4

समझ गया।

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

इस मामले में, यह मौजूदा (स्वत: जनरेट) निर्माता से कोड कॉपी करने के लिए आवश्यक है:

public IP(string address) { 
Address = address; 
Domain = ""; 
Notes = ""; 
FirstAccess = DateTime.Now; 
LastAccess = DateTime.Now; 
this._Sessions = new EntitySet<Session>(new Action<Session>(this.attach_Sessions), new Action<Session>(this.detach_Sessions)); 
OnCreated(); } 
नहीं

यकीन है कि क्या है कि OnCreated हैंडलर में है, लेकिन यह काम है कि बोन्ड कर किया जा रहा है मुझे पहले

public IP(string address) : this() 
{ 
    Address = address; 
    Domain = ""; 
    Notes = ""; 
    FirstAccess = DateTime.Now; 
    LastAccess = DateTime.Now; 
} 
+0

thx: डी LINQ ने मुझे वैसे ही बोन किया;) – SpoBo

+4

मुझे लगता है कि ऑटो-जेनरेटेड कन्स्ट्रक्टर को कॉल करना (इसका उपयोग करना:)()()()() का उपयोग करके इसे कॉपी-पेस्ट करने से बेहतर है। आपके उत्तर के लिए – svick

+0

thkx। अभी भी अस्पष्ट है कि हमें आंशिक कक्षा के साथ डेटाकॉन्टेक्स्ट क्लास का विस्तार क्यों करना है। मैंने इस तरह से करने की कोशिश की, 'पब्लिक क्लास आईपी: डीसीआईआईपी { सार्वजनिक आईपी(): बेस() {...} }' यहां क्या गलत है? – mehul9595

1

आप यह देखने का प्रयास कर सकते हैं कि क्या हो रहा है, क्या परिवर्तन किए जाएंगे, अगर आप सबमिटChanges से पहले ब्रेकपॉइंट डालते हैं, और dc.GetChangeSet() की त्वरित घड़ी करते हैं।

+0

ठीक है; यह उस रेखा तक कभी नहीं मिलता है क्योंकि अपवाद को InsertOnSubmit पर फेंक दिया जाता है। – tsilb

+0

वह समाधान नहीं था, लेकिन कुछ उपयोगी प्रदान करने के लिए +1 मुझे पता नहीं था। – tsilb

2

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

+0

नहीं, मैंने डेटा कॉन्टेक्स्ट बनाया, डेटा कनेक्शन से टेबल को खींच लिया और छोड़ दिया, और कन्स्ट्रक्टर के माध्यम से चला गया ... umm, निर्माण। सभी काम ठीक से चुनता है। – tsilb

+0

वह समाधान नहीं था, लेकिन +1 क्योंकि यह मुझे सामान्य दिशा में चला गया जो समाधान प्रदान करता था। – tsilb

5

क्योंकि डिफ़ॉल्ट निर्माता पहले से ही आधार(), this._Sessions initializes और OnCreated विधि चलाता है, तुम सब अपने विस्तारित निर्माता में क्या करने की जरूरत है इस वह भी इस तरह के रूप सामान्य निर्माता कॉल अपने निर्माता के लिए एक कॉल जोड़ने के लिए:

public IP(string address) : this() { 
... 
} 
10

वास्तव में यह बेहतर है: काम करता है ठीक अब :)

1

मैं प्रश्नकर्ता से कुछ भिन्न स्थिति थी, लेकिन एक ही कारण के लिए एक ही त्रुटि मिली। मैंने अपने डेटाबेस इकाइयों के लिए आंशिक कक्षा में नए रचनाकारों को लिखा, फिर परिणामस्वरूप वस्तुओं को InsertOnSubmit कॉल में उपयोग करने का प्रयास किया।

इन उत्तरों से कोई भी मुझसे सीधे मदद की, लेकिन मैं क्या वे उन सभी को पढ़ने के बाद से मिल रहे थे यह पता लगाने में सक्षम था।

इकाई के लिए स्वत: जनरेट parameterless निर्माता बातें InsertOnSubmit काम करने के लिए होने की जरूरत है कि क्या करता है, तो आप निर्माता ओवरलोड हैं - मेरे जैसे - या वर्ग से विरासत - प्रश्नकर्ता की तरह - आप की जरूरत इसलिए जैसे, अपने नए निर्माता से आधार निर्माता कॉल करने के लिए: [? क्या एक NullReferenceException है और कैसे करना है मैं इसे ठीक]

public partial class Entity { 
    public Entity(Type parameter) : this() { 
     // do things with the parameter 
    } 
} 

या

public class SubEntity: Entity { 
    public SubEntity(Type parameter) : base() { 
     // do things with the parameter 
    } 
} 
संबंधित मुद्दे