40

मैं एसक्यूएल सर्वर 2008 में निम्न तालिका परिभाषाएं हैं कहते हैं:मैं त्रुटि 3002 को कैसे खत्म करूं?

CREATE TABLE Person 
(PersonId INT IDENTITY NOT NULL PRIMARY KEY, 
Name VARCHAR(50) NOT NULL, 
ManyMoreIrrelevantColumns VARCHAR(MAX) NOT NULL) 

CREATE TABLE Model 
(ModelId INT IDENTITY NOT NULL PRIMARY KEY, 
ModelName VARCHAR(50) NOT NULL, 
Description VARCHAR(200) NULL) 

CREATE TABLE ModelScore 
(ModelId INT NOT NULL REFERENCES Model (ModelId), 
Score INT NOT NULL, 
Definition VARCHAR(100) NULL, 
PRIMARY KEY (ModelId, Score)) 

CREATE TABLE PersonModelScore 
(PersonId INT NOT NULL REFERENCES Person (PersonId), 
ModelId INT NOT NULL, 
Score INT NOT NULL, 
PRIMARY KEY (PersonId, ModelId), 
FOREIGN KEY (ModelId, Score) REFERENCES ModelScore (ModelId, Score)) 

विचार यहाँ है प्रत्येक व्यक्ति मॉडल में केवल एक ModelScore हो सकता है, लेकिन प्रत्येक व्यक्ति परिभाषित मॉडल के किसी भी संख्या के लिए एक स्कोर हो सकता है। जहां तक ​​मैं कह सकता हूं, इस एसक्यूएल को इन बाधाओं को स्वाभाविक रूप से लागू करना चाहिए। मॉडलस्कोर में एक विशेष "अर्थ" है, जो परिभाषा में निहित है। पृथ्वी पर कुछ भी नहीं टूट रहा है।

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

 
- Association 
    - Maps to PersonModelScore 
    - ModelScore 
     ModelId : Int32  <=> ModelId : int 
     Score : Int32   <=> Score : int 
    - Person 
     PersonId : Int32  <=> PersonId : int 

दाएँ हाथ की ओर पर, ModelId और PersonId मूल्यों प्राथमिक कुंजी प्रतीक है, लेकिन स्कोर मूल्य नहीं करता है: संघ के लिए मानचित्रण विवरण इस प्रकार है।

संकलन करने पर, मैंने मिलती है:

Error 3002: Problem in Mapping Fragment starting at line 5190: Potential runtime violation of table PersonModelScore's keys (PersonModelScore.ModelId, PersonModelScore.PersonId): Columns (PersonModelScore.PersonId, PersonModelScore.ModelId) are mapped to EntitySet ModelScorePersonAssociation's properties (ModelScorePersonAssociation.Person.PersonId, ModelScorePersonAssociation.ModelScore.ModelId) on the conceptual side but they do not form the EntitySet's key properties (ModelScorePersonAssociation.ModelScore.ModelId, ModelScorePersonAssociation.ModelScore.Score, ModelScorePersonAssociation.Person.PersonId).

क्या मैं अन्यथा डिजाइनर में गलत किया है या, और कैसे मैं त्रुटि को ठीक कर सकते हैं?

बहुत धन्यवाद!

+1

आपको शान के उत्तर को स्वीकार करना चाहिए। यह सही है और मेरे बेकन को बचाया। –

उत्तर

2

आपको प्रत्येक तालिका के लिए एक पहचान पहचान कुंजी बनाना चाहिए।

मॉडलस्कोर में ModelScoreId होना चाहिए, PersonModelScore में PersonModelScoreId होना चाहिए।

तालिका के बीच संदर्भ एक फ़ील्ड होना चाहिए।

+1

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

65

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

+0

यह फिक्स मेरे लिए काम किया। एक टेबल में दो प्राथमिक कुंजी थीं जब इसे केवल एक होना चाहिए था। – Jesslyn

+2

वही है। ईएफ ने फैसला किया कि सभी गैर-शून्य कॉलम प्राथमिक कुंजी का हिस्सा होना चाहिए जो उन्हें नहीं माना जाना चाहिए। –

+7

इसके लिए मुझे कुछ कदम उठाने में थोड़ा सा लगा, इसलिए स्पष्टता के लिए यहां जोड़ना। अपनी .edmx फ़ाइल पर जाएं, पृष्ठभूमि पर राइट क्लिक करें और 'मैपिंग विवरण' का चयन करें। अपनी .edmx विंडो में मैपिंग को संपादित करने के लिए आवश्यक तालिका पर क्लिक करें और विवरण आपके नए 'मैपिंग विवरण' विंडो में दिखने चाहिए। 'गुण' विंडो लाने के लिए F4 दबाएं (डिफ़ॉल्ट स्थान, आपके वीएस डिस्प्ले के निचले दाएं)। प्रदर्शित गुणों को बदलने के लिए अपने 'मानचित्रण विवरण' में 'मूल्य/संपत्ति' पर क्लिक करें, और अपनी प्रॉपर्टी विंडो से अब आप 'एंटिटी कुंजी' मान को 'गलत' पर सेट कर सकते हैं। –

0

आपका PersonModelScore तालिका एक आईडी स्तंभ है कि पहचान और प्राथमिक कुंजी है परिभाषित करना चाहिए, तो आप PersonId पर एक अद्वितीय कुंजी बनाने चाहिए, ModelId

त्रुटि 3002 के लिए के रूप में

, मैं एक ही समस्या सभी मेरे खेत था ईएफ

12

इस इकाई से बचने के लिए आप इकाई में एकल प्राथमिक कुंजी सेट कर सकते हैं। इकाई में क्षेत्र की स्केलर गुणों पर राइट क्लिक करें और कई प्राथमिक कुंजी होने पर इकाई कुंजी अक्षम करें।

+0

धन्यवाद! यह मेरे लिए हल किया गया, त्रुटि त्रुटि 3002: लाइन 9 42 से शुरू होने वाले टुकड़ों को मैप करने में समस्या: तालिका [tablename] की कुंजी ([entityname] आईडी) के संभावित रनटाइम उल्लंघन: कॉलम ([entityname] आईडी) मैप किए गए हैं एंटिटीसेट [इकाईसेट] गुणों ([tablename] आईडी) को वैचारिक पक्ष पर लेकिन वे EntitySet की मुख्य गुण नहीं बनाते हैं –

0

"अपनी .edmx फ़ाइल पर जाएं, पृष्ठभूमि पर राइट क्लिक करें और 'मैपिंग विवरण' का चयन करें। तालिका पर क्लिक करें जिसे आपको अपनी .edmx विंडो में मैपिंग संपादित करने की आवश्यकता है और विवरण आपके नए 'मैपिंग में दिखने चाहिए विवरण 'विंडो। ओपन प्रॉपर्टी टैब (' प्रॉपर्टी 'को खोलने के लिए एफ 4 दबाएं) प्रदर्शित होने वाली गुणों को बदलने के लिए' मैपिंग विवरण 'में' वैल्यू/प्रॉपर्टी 'पर क्लिक करें, और अपनी प्रॉपर्टी विंडो से अब आप सेट कर सकते हैं 'एंटिटी की' मूल्य 'झूठी' के लिए। - क्रिस पैटन अक्टूबर 4 '14 बजे 18:54 "

यह मेरे लिए काम करता है - धन्यवाद यह अब ईएफ डाटाबेस फर्स्ट का उपयोग करते समय मेरे वर्कफ़्लो का हिस्सा है। और हमारे पास डेटा मॉडल को अपडेट करने का कार्य है।

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