2009-03-06 10 views
14

मैं संबंधों वाले कुछ विरासत तालिकाओं के साथ काम कर रहा हूं, लेकिन उन रिश्ते को प्राथमिक/विदेशी कुंजी के रूप में स्पष्ट रूप से सेट नहीं किया गया है। मैंने "लिंक से एसक्यूएल क्लासेस" का उपयोग करके एक .dbml फ़ाइल बनाई और उचित केस.CaseID = CaseInfo.CaseID एसोसिएशन की स्थापना की। मेरी परिणामी कक्षा CasesDataContext है।स्पष्ट विदेशी कुंजी रिश्तों के बिना लिंक से एसक्यूएल

मेरे टेबल्स (कई लोगों के लिए एक):

Case 
------------------ 
CaseID (int not null) 
MetaColumn1 (varchar) 
MetaColumn2 (varchar) 
MetaColumn3 (varchar) 
... 


CaseInfo 
------------------ 
CaseInfoID (int) 
CaseID (int nulls allowed) 
CaseInfoMeta (varchar) 
... 

मैं LinqToSql के लिए नया हूँ और मुसीबत कर रही हो रहा है ..

CasesDataContext db = new CasesDataContext(); 
var Cases = from c in db.Cases 
      where c.CaseInfo.CaseInfoMeta == "some value" 
      select c; 

(संपादित) मेरी समस्या यह है कि CaseInfo या CaseInfos मामलों के सदस्य के रूप में उपलब्ध नहीं है।

मैंने एक सहयोगी से सुना है कि मैं अपना डेटा संदर्भ वर्ग बनाने के लिए एडीओ.Net इकाई डेटा मॉडल का प्रयास कर सकता हूं, लेकिन अभी तक यह कोशिश नहीं की है और देखना चाहता हूं कि मैं अपना समय बर्बाद कर रहा हूं या मुझे जाना चाहिए एक और रास्ता किसी भी सुझाव, लिंक, मदद की सराहना की जाएगी।

+0

क्या आपने डीबीएमएल फ़ाइल को सहेजा था? मुझे नहीं लगता कि यह आपके द्वारा सहेजने तक सीएस फाइलें उत्पन्न करता है। हो सकता है कि यह सदस्य के रूप में CaseInfo क्यों नहीं दिखा रहा है। –

+0

@madcolor, मैंने अपने उत्तर में एक नमूना कॉन्फ़िगरेशन पोस्ट किया है, कृपया इसे जांचें क्योंकि यह शायद संबंध कॉन्फ़िगरेशन – eglasius

उत्तर

26

वापस डिजाइनर पर जाएँ और जाँच संबंध ठीक से सेट है। यहां एक वास्तविक जीवन उदाहरण है, बिलस्टेटमास्टर्स के पास "ग्राहकमास्टर्स 1" संपत्ति है (राज्य के लिए ग्राहक): alt text http://i43.tinypic.com/ohl00l.jpg

Ps। नामकरण साफ किया जा रहा है ...

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

+3

फ्रेडी का समाधान है .. केवल एक चेतावनी है कि आपको "सदस्य त्रुटि के लिए गलत ऑटोसिंक विनिर्देश" मिलेगा यदि आपकी प्राथमिक कुंजी भी एक पहचान फ़ील्ड है। आपको डिज़ाइनर में उस कॉलम के लिए ऑटो-सिंक बंद करना पड़ सकता है। – madcolor

+1

प्राथमिक कुंजी नहीं होने पर मुझे ट्राइप किया गया! सहायता –

+3

आह, प्राथमिक कुंजी के लिए धन्यवाद! मेरे द्वारा प्राथमिक कुंजी के लिए +1 –

0

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

नोट: मैं बस अनुमान लगा रहा हूं क्योंकि आपने वास्तव में हमें नहीं बताया है कि वास्तव में "परेशानी" क्या है।

0

आपकी क्वेरी सही दिखती है और केस ऑब्जेक्ट्स का एक क्वेरी परिणाम सेट वापस कर देना चाहिए।

तो ... समस्या क्या है?

(संपादित) जा रहा है कि CaseInfo मामले के तहत उपलब्ध नहीं है मेरे समस्या ... यानी c.CaseInfo जहाँ मैं संभालने कर रहा हूँ अगर वहाँ थे स्पष्ट प्राथमिक/विदेशी यह होगा अस्तित्व में नहीं है कुंजी संबंध।

"उपलब्ध नहीं" से आपका क्या मतलब है? आप डिजाइनर में संघ बनाया था, तो के रूप में आप कहते हैं कि तुम किया था, फिर क्वेरी की

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
    ON Case.CaseID = CaseInfo.CaseID 
WHERE CaseInfo.CaseInfoMeta = 'some value' 

आप अपने LINQ क्वेरी डिबग है एसक्यूएल अभी तक जेनरेट करने के लिए पंक्तियों के साथ एसक्यूएल कुछ उत्पन्न करनी चाहिए? यह वापस क्या करता है?

+0

के साथ कोई समस्या है .. linq के लिए नया। केसइन्फो केस के सदस्य के रूप में नहीं दिख रहा है। – madcolor

+0

क्या आपने डिजाइनर में सहयोग बनाया था? क्या कोई केस इन्फोस संपत्ति है? – Randolpho

+0

मैंने केसआईडी पर एसोसिएशन (पैरेंट क्लास = केस, चाइल्ड क्लास = केसइन्फो) बनाया था। मामलों के तहत कोई केसइन्फो सदस्य दिखाई नहीं दे रहा है। – madcolor

0

चीजें आप की कोशिश करना चाहते हो सकता है के युगल:

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

चूंकि आपको सी पर केसइन्फो नहीं मिल रहा है, इसलिए आपको यह देखने के लिए दूसरी दिशा टाइप करने का प्रयास करें कि क्या आपको सीआई मिलती है। इंटेलिजेंस के साथ केस।

सभी को एक साथ हटाएं और फिर से बनाएं।

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

यदि अन्य सभी विफल हो जाते हैं, तो NHibernate पर स्विच करें। :)

0

क्या यह सी # है? मुझे लगता है कि आप इस लाइन पर = के बजाय == की जरूरत है:

where c.CaseInfo.CaseInfoMeta = "some value" 

पढ़ना चाहिए

where c.CaseInfo.CaseInfoMeta == "some value" 
+0

यह है, लेकिन यह मेरी पोस्ट (अपडेटेड) में एक गलती थी। हालांकि इस मुद्दे के साथ अभी भी अटक गया। – madcolor

5
CasesDataContext db = new CasesDataContext(); 
var Cases = from c in db.Cases 
      join ci in db.CaseInfo on 
      ci.ID equals c.InfoID 
      where ci.CaseInfoMeta == "some value" 
      select new {CASE=c, INFO=ci}; 

मेरी "में शामिल होने के" LINQ थोड़ा जंग लगी है, लेकिन इसके बाद के संस्करण क्या आप के बाद कर रहे हैं के पास मिलना चाहिए।

0

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

+0

मेरा जवाब अपडेट किया गया है, तो आप डिज़ाइनर में परिभाषित कर सकते हैं लेकिन आपको यह सुनिश्चित करने की ज़रूरत है कि दोनों टेबलों में प्राथमिक कुंजी हो (जो डिज़ाइनर में भी किया जा सकता है - अगर किसी अजीब कारण के लिए डीबी पर नहीं हो सकता है)। – eglasius

+0

आप डिज़ाइनर में प्राथमिक कुंजी को परिभाषित कर सकते हैं, लेकिन यदि वे डीबी में टेबल पर मौजूद नहीं हैं, तो आपको "सदस्य त्रुटि के लिए गलत ऑटोसिंक विनिर्देश" प्राप्त होगा। इसके लिए, ऊपर फ्रेडी की टिप्पणी थोड़ा भ्रामक है। – madcolor

+0

अद्यतन: एल 2 एसक्यूएल डिजाइनर में, मैंने दोनों कॉलम को दोनों टेबलों (केसआईडी) में प्राथमिक कुंजी के रूप में सेट किया और केस पर केसआईडी कॉलम के लिए "ऑटो-सिंक" बंद कर दिया और सभी काम कर रहे हैं .. धन्यवाद फ्रेडी। – madcolor

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