2011-02-23 15 views
7

पर तालिका प्रति प्रकार विरासत समस्या तालिका में मेरे पास "बेसइन्टिटी" और व्युत्पन्न "फंड" इकाई के साथ सरल मॉडल है। जब मैं किसी नए फंड को सम्मिलित करने का प्रयास करें:इकाई फ्रेमवर्क 4: सम्मिलित

HybridModelContainer container = new HybridModelContainer(); 

//Create new Fund 
Fund fund = new Fund(); 
fund.Id = Guid.NewGuid(); 
fund.DateCreated = DateTime.Now; 
fund.Name = "Fund 1"; 
fund.Number = 1; 
container.BaseEntities.AddObject(fund); 

container.SaveChanges(); 

मैं निम्नलिखित त्रुटि मिलती है:

"Cannot insert the value NULL into column 'Id', table 'HybridData.dbo.BaseEntities'; column does not allow nulls. INSERT fails.
The statement has been terminated."

ऐसा लगता है कि आईडी निधि संस्था को सौंपा BaseEntity तालिका में सम्मिलित नहीं है। क्यों नहीं?

मैंने यह "मॉडल पहले" किया था। यदि मैं पहले डेटाबेस को डिज़ाइन करता हूं, और उससे मॉडल बना देता हूं, तो सब कुछ ठीक काम करता है .... लेकिन मुझे पहले मॉडल की ज़रूरत है!

enter image description here

भी ... क्यों नहीं वहाँ "Funds" के लिए एक ObjectSet में मेरी DataContext (अर्थात, container.Funds)? आपकी सहायता के लिये पहले से ही धन्यवाद!

+0

'हाइब्रिडमोडेलकंटनर' क्या है? अपनी 'फंड' इकाई के लिए मैपिंग विवरण का एक स्क्रीनशॉट पोस्ट करें। –

+0

यह सिर्फ डेटाकॉन्टेक्स्ट का नाम है। – SolarX

+0

@ सोलार्क्स: क्या आप कृपया स्क्रीनशॉट पोस्ट कर सकते हैं जिसका मैंने उल्लेख किया था? –

उत्तर

9

मैं केवल आपके प्रश्न के दूसरे भाग के लिए उत्तर दे सकता हूं: "इसके अलावा ... मेरे डेटाकॉन्टेक्स्ट (यानी कंटेनर.फंड्स) में" फंड "के लिए ऑब्जेक्टसेट क्यों नहीं है?"

यह सामान्य है कि ऑब्जेक्ट कॉन्टेक्स्ट में आपके वर्ग पदानुक्रम में केवल बेस क्लास का ऑब्जेक्टसेट है। व्युत्पन्न कक्षाओं के ऑब्जेक्टसेट की वास्तव में आवश्यकता नहीं है। ऑब्जेक्ट कॉन्टेक्स्ट से व्युत्पन्न ऑब्जेक्ट्स को जोड़ने और हटाने के लिए आप AddObject और DeleteObjectObjectSet<BaseEntity>/BaseEntities के तरीकों का उपयोग कर सकते हैं जैसा आपने पहले से ही किया है।

व्युत्पन्न वस्तुओं से पूछताछ के लिए आप ऑब्जेक्टसेट के OfType विधि का लाभ उठा सकते हैं। यह व्युत्पन्न प्रकार जहां पर आगे प्रश्नों का निर्माण कर सकते का एक ObjectQuery रिटर्न:।

ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>(); 

(अपने प्रश्न के पहले भाग भंडारण और वैचारिक मॉडल के बीच एक मैपिंग त्रुटि की तरह लगता है यह आप सीआईएफ एक बेहतर हो सकता है अपने edmx फ़ाइल के प्रासंगिक भागों दिखा सकता है)

संपादित करें:। प्रश्न के पहले भाग के लिए संभावित समाधान:

मैं VS2010 में के साथ अपने उदाहरण बना लिया है मॉडल-पहले और मैं पुन: पेश कर सकता अपने मुद्दा। समस्या इस तथ्य से संबंधित प्रतीत होती है कि आपके मॉडल में प्राथमिक कुंजी Int32 नहीं है लेकिन Guid है। जब आप मॉडल में एक नई इकाई जोड़ते हैं तो डिजाइनर हमेशा Int32 को StoreGeneratedPattern के साथ प्राथमिक कुंजी के रूप में Identity पर सेट करता है।

यदि आप अभी Guid को Int32 से मॉडल डिज़ाइनर में महत्वपूर्ण के प्रकार बदल सकता है लेकिन छोड़ StoreGeneratedPattern अपरिवर्तित जा रहा है Identity, DDL एसक्यूएल सर्वर में एक डेटाबेस Id सेट के साथ uniqueidentifier लेकिन पहचान विनिर्देश टाइप करने के लिए है कि स्तंभ है बनाता है "नहीं"।

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

समाधान: BaseEntityStoreGeneratedPattern की Id संपत्ति None करने के लिए मॉडल डिज़ाइनर में सेट करें। मेरे लिए यह तब काम किया। बेशक, आप ऑब्जेक्टसेट में एक नई ऑब्जेक्ट जोड़ने से पहले Id पर हमेशा एक ग्रिड असाइन करने के लिए ज़िम्मेदार होते हैं, लेकिन ऐसा लगता है कि आप वैसे भी चाहते हैं।

+0

धन्यवाद। मैंने डेटाबेस के पहले दृष्टिकोण के साथ एक ही चीज़ की कोशिश की और सबकुछ काम करता है (संबंधों को हटाने और मॉडल में विरासत स्थापित करने के बाद)। मैं इसे "मॉडल पहले" दृष्टिकोण के साथ काम करने के लिए नहीं मिल सकता। लेकिन हम पहले मॉडल जाना चाहते हैं। कोई उपाय? – SolarX

+0

@ सोलेरएक्स: शायद मुझे समाधान मिला: ऊपर दिए गए मेरे उत्तर में संपादित करें देखें। – Slauma

+0

जैसे ही मैं अपनी बैठकों में आता हूं, मैं इसे आजमाउंगा ... मुझे उम्मीद थी कि यह ग्विड के साथ समस्या होगी। यह उत्सुक है कि मुझे वेब पर उस पर कुछ भी नहीं मिला। आपकी मदद के लिए बहुत बहुत धन्यवाद !! – SolarX

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