EntitySet को अपडेट करने में असमर्थ - क्योंकि इसमें DefiningQuery है और कोई <UpdateFunction> तत्व मौजूद नहीं है


533

मैं .net 3.5 के साथ Entity फ्रेमवर्क 1 का उपयोग कर रहा हूं।

मैं इस तरह से कुछ सरल कर रहा हूं:

var roomDetails = context.Rooms.ToList();

foreach (var room in roomDetails)
{        
   room.LastUpdated = DateTime.Now;
}

जब मैं करने की कोशिश कर रहा हूं तो मुझे यह त्रुटि मिल रही है:

 context.SaveChanges();

मुझे त्रुटि मिली:

EntitySet को अपडेट करने में असमर्थ - क्योंकि इसमें एक DefiningQuery है और कोई <UpdateFunction> तत्व मौजूदा ऑपरेशन का समर्थन करने के लिए <ModificationFunctionMapping> तत्व में मौजूद है।

मैं संदर्भ पर बहुत सारे अपडेट कर रहा हूं और कोई समस्या नहीं है, यह केवल तभी है जब मैं इस विशेष इकाई को अपडेट करने का प्रयास करता हूं।

मेरी सभी खोज एक ही बात दर्शाती है, कि जिस इकाई को मैं अपडेट करने की कोशिश कर रहा हूं, उस पर कोई प्राथमिक कुंजी घोषित नहीं की गई है। लेकिन अफसोस, मेरे पास एक प्राथमिक कुंजी घोषित है ...


61
मैंने एक गलती की, मेज पर एक प्राथमिक कुंजी सेट नहीं थी, आपके समय के लिए धन्यवाद! असुविधा के लिए खेद है!
आईकोड

1
बस मेरे साथ हुआ - शायद प्राथमिक कुंजियों के साथ 1000 तालिकाओं का निर्माण किया गया था, और एक भूल गया - अपवाद संदेश बहुत मदद नहीं करता है
पीटर म्यूनिग्स

1
अति उत्कृष्ट। वास्तव में मैं तालिका में प्राथमिक कुंजी जोड़ना भूल गया। आइए सावधान रहने की कोशिश करें)
AEMLoviji

जवाबों:


1022

यह आमतौर पर होता है क्योंकि निम्न कारणों में से एक:

  • Entity Set को डेटाबेस दृश्य से मैप किया गया है
  • एक कस्टम डेटाबेस क्वेरी
  • डेटाबेस तालिका में एक प्राथमिक कुंजी नहीं है

ऐसा करने के बाद, आपको त्रुटि मिलने से पहले ही एंटिटी फ्रेमवर्क डिज़ाइनर (या वैकल्पिक रूप से इकाई को हटाना और फिर जोड़ना) में अपडेट करना पड़ सकता है।


2
यह भी सुनिश्चित करें कि स्टोर में बदलाव करें: स्कीम्स को सिर्फ उस एंटिटीसेट के लिए स्कीमा के लिए, अगर आपको अभी भी परेशानी हो रही है।
ज्योफ

53
तब इकाई को हटा दें और फिर से बनाएँ क्योंकि अपडेट ईएफ डिजाइनर में सही काम नहीं करता है।
सनकैट २००

48
पीके का जवाब था। धन्यवाद!
nrod

1
डेटाबेस में प्राथमिक कुंजी जोड़ने के बाद ईएफ डिजाइनर में अपडेट ने मेरे लिए ठीक काम किया। EF 5.0 और .net 4.0 का उपयोग कर
स्टिल लोरिन

1
मुझे भी ! Thx ... को टेबल निकालना था और EF को जोड़ना था, हालांकि इसे लेने के लिए
ajzeffer

90

बस तालिका में एक प्राथमिक कुंजी जोड़ें। बस। समस्या सुलझ गयी।

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

13
और अपनी .edmx फ़ाइल पर "डेटाबेस से अद्यतन मॉडल" पर क्लिक करना न भूलें
बशर अबू शमा

@BasharAbuShamaa यह विवरण उस विवरण के बिना मान्य नहीं है।
केहलान क्रुमे

66

यह मेरे लिए मामला है। बस हटाने के परिणामस्वरूप एक और त्रुटि हुई। मैंने पिछले एक को छोड़कर इस पोस्ट के चरणों का पालन किया। आपकी सुविधा के लिए, मैंने उस पोस्ट से 4 चरणों की प्रतिलिपि बनाई जो मैंने निम्नलिखित समस्या को हल करने के लिए अपनाई थी:

  1. Edmx फ़ाइल पर राइट क्लिक करें, Open with, XML Editor चुनें
  2. Edmx में इकाई का पता लगाएँ: StorageModels तत्व
  3. पूरी तरह से DefiningQuery निकालें
  4. नाम बदलें store:Schema="dbo"करने के लिए Schema="dbo"(अन्यथा, कोड नाम बोलकर एक त्रुटि उत्पन्न होगा अमान्य है)

आपका बहुत - बहुत धन्यवाद बहुत परेशान है कि यह ईएफ में तय नहीं किया गया है। और, बहुत अद्भुत है कि आप यह पता लगा!
साइकिल डेव

मैंने इकाई को हटाने और इसे फिर से जोड़ने की कोशिश की। फिर कंपाइल। सफाई। इसके अलावा मेरे लिए कुछ भी काम नहीं किया।
प्रात:

1
इसने मेरे मुद्दे को हल कर दिया है फिर भी मुझे नहीं पता कि आप जवाब के साथ कैसे आए और आपके सुझाव ने समस्या को हल क्यों किया।
23

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

यह वास्तव में अजीब मुद्दा है। क्या इससे बचने के लिए कोई समस्या है? फिर भी - इससे मदद मिली
r3dst0rm

41

बस ध्यान दें कि शायद आपके एंटिटी में प्राथमिक कुंजी हो लेकिन डेटाबेस में आपकी तालिका में प्राथमिक कुंजी नहीं है


1
यदि हम डेटाबेस तालिका को बदल नहीं सकते हैं, तो कैसे दूर करें?
काई हार्टमैन 14

यदि आप एक प्राथमिक कुंजी रखने के लिए DB तालिका को बदल सकते हैं तो कोड जनरेटर एक ही गलतियाँ करना बंद कर देगा, ईएफ से कुंजी को हटाने से कई अन्य मुद्दे हो जाएंगे।
क्रिस स्कॉलर

30

अपडेट करें: मैं हाल ही में इस पर कुछ upvotes मिल गया है, तो मुझे लगा कि मैं लोगों को सलाह देना होगा कि मैं नीचे दे सबसे अच्छा नहीं है। चूंकि मैंने मूल रूप से पुराने बिना चाबी वाले डेटाबेस पर एंटिटी फ्रेमवर्क करने के साथ छेड़छाड़ करना शुरू कर दिया है, इसलिए मुझे पता चला है कि BY FAR द्वारा सबसे अच्छी चीज जो आप कर सकते हैं वह है रिवर्स कोड-प्रथम। ऐसा करने के लिए वहाँ पर कुछ अच्छे लेख हैं। बस उनका अनुसरण करें, और फिर जब आप इसमें एक कुंजी जोड़ना चाहते हैं, तो कुंजी को "नकली" करने के लिए डेटा एनोटेशन का उपयोग करें।

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

    [Key, Column(Order = 0)]
    public Int32? OrderNumber { get; set; }

    [Key, Column(Order = 1)]
    public String Customer { get; set; }

ऐसा करने से, आप मूल रूप से ईएफ को विश्वास में लेते हैं कि ऑर्डरनंबर और ग्राहक से मिलकर एक संकुल कुंजी है। इससे आप अपनी कीलेस टेबल पर इंसर्ट, अपडेट आदि कर सकेंगे।

यदि आप रिवर्स कोड फर्स्ट करने से बहुत परिचित नहीं हैं, तो जाएं और एंटिटी फ्रेमवर्क कोड फर्स्ट पर एक अच्छा ट्यूटोरियल ढूंढें। फिर रिवर्स कोड फर्स्ट पर एक खोजें (जो मौजूदा डेटाबेस के साथ कोड फर्स्ट कर रहा है)। तो बस यहाँ वापस आओ और फिर से मेरी महत्वपूर्ण सलाह को देखो। :)

मूल उत्तर :

पहला: जैसा कि दूसरों ने कहा है, सबसे अच्छा विकल्प तालिका में एक प्राथमिक कुंजी जोड़ना है। पूर्ण विराम। यदि आप ऐसा कर सकते हैं, तो आगे पढ़ें।

लेकिन अगर आप अपने आप से नफरत नहीं कर सकते, या नहीं कर सकते, तो प्राथमिक कुंजी के बिना ऐसा करने का एक तरीका है।

मेरे मामले में, मैं एक विरासत प्रणाली के साथ काम कर रहा था (मूल रूप से एक AS400 पर फ्लैट फाइलें एक्सेस और फिर टी-एसक्यूएल में रखी गई)। इसलिए मुझे एक रास्ता खोजना पड़ा। यह मेरा समाधान है। निम्नलिखित ने मेरे लिए Entity Framework 6.0 (इस लेखन के रूप में NuGet पर नवीनतम) का उपयोग करके काम किया।

  1. समाधान एक्सप्लोरर में अपनी .edmx फ़ाइल पर राइट-क्लिक करें। "ओपन विथ ..." चुनें और फिर "एक्सएमएल (टेक्स्ट) एडिटर" चुनें। हम यहाँ स्वतः-जनरेट किए गए कोड का संपादन करने जा रहे हैं।

  2. इस तरह एक लाइन के लिए देखो:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">

  3. store:Name="table_name"अंत से हटा दें ।

  4. बदलें store:Schema="whatever"करने के लिएSchema="whatever"

  5. उस रेखा के नीचे देखें और <DefiningQuery>टैग ढूंढें । इसमें एक बड़ा ol 'सेलेक्ट स्टेटमेंट होगा। टैग निकालें और यह सामग्री है।

  6. अब आपकी लाइन कुछ इस तरह दिखनी चाहिए:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />

  7. हमारे पास बदलने के लिए कुछ और है। अपनी फ़ाइल के माध्यम से जाओ और यह पता लगाएं:
    <EntityType Name="table_name">

  8. पास ही आप शायद कुछ टिप्पणी की गई पाठ चेतावनी आपको देखेंगे कि इसमें प्राथमिक कुंजी की पहचान नहीं थी, इसलिए कुंजी को अनुमान लगाया गया है और परिभाषा केवल पढ़ने के लिए तालिका / दृश्य है। आप इसे छोड़ सकते हैं या इसे हटा सकते हैं। मैंने इसे मिटा दिया।

  9. नीचे <Key>टैग है। यह एंटिटी फ्रेमवर्क डालने / अपडेट / डिलीट करने के लिए उपयोग करने वाला है। तो आपको लगता है कि यह सही है। उस टैग में मौजूद संपत्ति (या गुण) को विशिष्ट पहचान योग्य पंक्ति को इंगित करने की आवश्यकता है। उदाहरण के लिए, मान लें कि मैं अपनी तालिका जानता हूं orders, जबकि इसकी प्राथमिक कुंजी नहीं है, केवल प्रति ग्राहक एक आदेश संख्या रखने का आश्वासन दिया गया है।

तो मेरा ऐसा दिखता है:

<EntityType Name="table_name">
              <Key>
                <PropertyRef Name="order_numbers" />
                <PropertyRef Name="customer_name" />
              </Key>

गंभीरता से, यह गलत मत करो। मान लीजिए कि भले ही कभी भी डुप्लिकेट नहीं होना चाहिए, किसी भी तरह दो पंक्तियाँ समान क्रम संख्या और ग्राहक के नाम के साथ मेरे सिस्टम में आती हैं। Whooops! कि मैं एक कुंजी का उपयोग नहीं करने के लिए क्या मिलता है! इसलिए मैं एक को हटाने के लिए एंटिटी फ्रेमवर्क का उपयोग करता हूं। क्योंकि मुझे पता है कि डुप्लिकेट आज में एकमात्र ऑर्डर है, मैं यह करता हूं:

var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today);
myModel.orders.Remove(duplicateOrder);

अंदाज़ा लगाओ? मैंने अभी डुप्लिकेट और मूल दोनों को हटा दिया है! ऐसा इसलिए है क्योंकि मैंने एंटिटी फ्रेमवर्क को बताया है कि order_number / cutomer_name मेरी प्राथमिक कुंजी थी। इसलिए जब मैंने इसे डुप्लिकेट को हटाने के लिए कहा था, तो उसने पृष्ठभूमि में जो किया वह कुछ इस तरह था:

DELETE FROM orders
WHERE order_number = (duplicateOrder's order number)
AND customer_name = (duplicateOrder's customer name)

और उस चेतावनी के साथ ... आपको अब जाना अच्छा होना चाहिए!


समस्या का एक ही समाधान खोजने के बाद यह उत्तर मिला। निश्चित रूप से सही उत्तर! केवल प्राथमिक कुंजी को परिभाषित करना जैसे कि अन्य उत्तरों में वर्णित कई मामलों में मदद नहीं करेगा।
ओबल टोबेल

19

यह तब भी हो सकता है जब डेटा मॉडल पुराना हो गया हो।

उम्मीद है कि यह किसी और हताशा को बचाएगा :)


6

मुझे वही त्रुटि संदेश मिल रहा था, लेकिन मेरे परिदृश्य में मैं PJT (प्योर जॉइन टेबल) का उपयोग करके कई-से-कई संबंधों से प्राप्त संस्थाओं को अपडेट करने का प्रयास कर रहा था।

अन्य पदों को पढ़ने से, मुझे लगा कि मैं एक अतिरिक्त पीके फ़ील्ड को ज्वाइन टेबल पर जोड़कर इसे ठीक कर सकता हूं ... हालांकि, यदि आप किसी जॉइनिंग टेबल में पीके कॉलम जोड़ते हैं, तो यह अब पीजेटी नहीं है और आप सभी को खो देते हैं संस्थाओं के बीच स्वत: संबंध मानचित्रण की तरह इकाई ढांचा लाभ।

तो मेरे मामले में समाधान एक पीके बनाने के लिए DB पर ज्वाइन टेबल को बदलना था जिसमें विदेशी आईडी कॉलम का BOTH शामिल है।


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

4

एक त्रुटि हो सकती है, यदि आपकी तालिका में प्राथमिक कुंजी नहीं है, तो इस मामले में तालिका "केवल पढ़ने के लिए" है, और db.SaveChanges () कमांड हमेशा एक त्रुटि लाएगा।


4

प्राथमिक कुंजी सेट करें और फिर तालिका सहेजें और फिर ताज़ा करें। Model.edmx हटाएं तालिका पर जाएं और फिर से प्राप्त करें।


3

तो यह सच है, बस एक प्राथमिक कुंजी जोड़ें

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


2

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


1

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

पता चला कि मेज पर कोई चाबी नहीं थी। EF कई कई कुंजियों के साथ मॉडल तैयार कर रहा था। मुझे SQL में db टेबल पर एक प्राथमिक कुंजी जोड़ने के लिए जाना था और फिर VS में अपना मॉडल अपडेट किया।

उसने मेरे लिए इसे हल कर दिया।


1

यह एक नया उत्तर नहीं है, लेकिन किसी ऐसे व्यक्ति की मदद करेगा जो यह सुनिश्चित नहीं कर सकता है कि उनकी मेज के लिए प्राथमिक कुंजी कैसे सेट करें। इसे एक नई क्वेरी में उपयोग करें और चलाएं। यह UniqueID कॉलम को प्राथमिक कुंजी के रूप में सेट करेगा।

USE [YourDatabaseName]
GO

Alter table  [dbo].[YourTableNname]
Add Constraint PK_YourTableName_UniqueID Primary Key Clustered (UniqueID);
GO

1

यहाँ छवि विवरण दर्ज करें

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


0

प्राथमिक कुंजी जोड़ना मेरे लिए भी काम किया!

एक बार यह हो जाने के बाद, यहां डेटा मॉडल को बिना डिलीट किए कैसे अपडेट किया जाए -

Edmx Entity डिज़ाइनर पेज और 'डेटाबेस से अपडेट मॉडल' पर राइट क्लिक करें।


0

मुझे ठीक वही समस्या थी, दुर्भाग्य से, प्राथमिक कुंजी को जोड़ने से समस्या हल नहीं होती है। तो यहां बताया गया है कि मैं कैसे हल करता हूं:

  1. सुनिश्चित करें कि आपके पास ए primary key तालिका है, इसलिए मैंने अपनी तालिका बदल दी और एक प्राथमिक कुंजी जोड़ दी।
  2. Delete the ADO.NET Entity Data Model (edmx फ़ाइल) जहां मैं अपने डेटाबेस से मैप और कनेक्ट करने के लिए उपयोग करता हूं।
  3. Add again a new file of ADO.NET Entity Data Model मेरे डेटाबेस से जुड़ने के लिए और मेरे मॉडल गुणों की मैपिंग के लिए।
  4. Clean and rebuild the solution.

समस्या सुलझ गयी।


0

बस अपनी मेज पर एक प्राथमिक कुंजी जोड़ें और फिर अपने ईएफ को फिर से बनाएँ


0

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


0

मेरे पास यह मुद्दा आया था और यह विश्वास था कि यह इसलिए हुआ क्योंकि मैंने अपनी तालिकाओं की प्राथमिक कुंजी पर सूचकांक को हटा दिया था और इसे तालिका के कुछ अन्य क्षेत्रों के सूचकांक के साथ बदल दिया था।

जब मैंने प्राथमिक कुंजी सूचकांक को हटा दिया और edmx को ताज़ा किया, तो आवेषण ने काम करना बंद कर दिया।

मैंने पुराने संस्करण में तालिका को ताज़ा किया, edmx को ताज़ा किया और सब कुछ फिर से काम करता है।

मुझे ध्यान देना चाहिए कि जब मैंने इस मुद्दे का निवारण करने के लिए ईडीएमएक्स को खोला था, तो यह देखने के लिए कि क्या कोई प्राथमिक कुंजी परिभाषित है, जाँच कर रहा था। इसलिए उपरोक्त सुझावों में से कोई भी मेरी मदद नहीं कर रहा था। लेकिन प्राथमिक कुंजी पर सूचकांक को ताज़ा करने से काम करने लगा।


0

XML एडिटर में अपनी .edmx फ़ाइल खोलें और फिर टैग से टैग हटाएं और स्टोर भी बदलें: स्कीमा = "dbo" टू स्कीमा = "डीबीओ" और उस समाधान का पुनर्निर्माण करें जिससे अब त्रुटि हल हो जाएगी और आप डेटा को सहेज पाएंगे।


0

मुझे अपनी स्थिति में .edmx फ़ाइल के काम को अद्यतन करने का मूल उत्तर मिला। मैं डेटाबेस से अपडेट होने पर हर बार मॉडल को बदलने के बारे में बहुत खुश नहीं था। इसीलिए मैंने एक अतिरिक्त टेक्स्ट टेम्प्लेट फ़ाइल लिखी है, जो कि मॉडल बदलने के बाद ऑटोमैटिकली इनवॉइस है - जैसे इकाइयाँ नई उत्पन्न होती हैं। मैं इसे इस टिप्पणी में यहाँ पोस्ट करता हूं। इसे काम करने के लिए, सुनिश्चित करें कि आप इसे {model name} .something.tt की तरह नाम दें, और इसे अपने .edmx फ़ोल्डर के समान फ़ोल्डर में संग्रहीत करें। मैंने इसे {मॉडल का नाम} .NonPkTables.tt नाम दिया है। दूसरी पंक्ति में अमान्य फ़ाइल एक्सटेंशन परिभाषा के कारण यह अपने आप एक फ़ाइल उत्पन्न नहीं करता है। बेझिझक इस्तेमाल करें।

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ output extension="/" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq"#>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\EntityFramework.dll" #>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\Microsoft.Data.Entity.Design.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Mapping" #>
<#@ import namespace="System.CodeDom" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Diagnostics" #>

<#
    string modelFileName= this.Host.TemplateFile.Split('.')[0] + ".edmx";
    string edmxPath = this.Host.ResolvePath( modelFileName );

    // MessageBox.Show( this.Host.TemplateFile + " applied." );
    var modelDoc = XDocument.Load(edmxPath);
    var root = modelDoc.Root;
    XNamespace nsEdmx = @"http://schemas.microsoft.com/ado/2009/11/edmx";
    XNamespace ns = @"http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

    var runtime = root.Elements(nsEdmx + "Runtime").First();
    var storageModels = runtime.Elements(nsEdmx + "StorageModels").First();
    XNamespace nsStore = @"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator";

    var schema = storageModels.Elements(ns + "Schema").First();
    XNamespace nsCustomAnnotation = @"http://schemas.microsoft.com/ado/2013/11/edm/customannotation";

    var entityTypes = schema.Nodes().OfType<XComment>().Where(c => c.Value.Contains("warning 6002: The table/view"));
    bool changed = false;

    foreach (var node in entityTypes)
    {
        var element = node.ElementsAfterSelf().First();
        string entityName = element.Attribute("Name").Value;

        // Find EntitySet in EntityContainer.
        var entityContainer = schema.Elements(ns + "EntityContainer").First();
        var entitySet = entityContainer.Elements(ns + "EntitySet").First(s => s.Attribute("Name").Value == entityName);

        // Change "store:Schema" attribute to "Schema" attribute.
        var attribute = entitySet.Attribute(nsStore + "Schema");

        if (attribute != null)
        {
            string schemaName = entitySet.Attribute(nsStore + "Schema").Value;
            entitySet.Attribute(nsStore + "Schema").Remove();
            entitySet.Add(new XAttribute("Schema", schemaName));
            changed |= true;
        }

        // Remove the DefiningQuery element.
        var definingQuery = entitySet.Element(ns + "DefiningQuery");

        if (definingQuery != null)
        {
            definingQuery.Remove();
            changed |= true;        
            Debug.WriteLine(string.Format("Removed defining query of EntitySet {0}.", entityName));
        }
    }

    if (changed)
        modelDoc.Save(edmxPath);
#>

-1

मैंने एक ही त्रुटि संदेश को कई-से-कई संबंध वाली तालिका में रिकॉर्ड सम्मिलित करने के लिए सामना किया । मेरा डेटाबेस स्कीमा था:

Student (Id , Name)
Course (Code , Title),
Student-Course (Student_ID, Course_Code)

तालिका छात्र और पाठ्यक्रम के पास प्राथमिक कुंजी क्रमांक आईडी और कोड है , जबकि तालिका छात्र-पाठ्यक्रम में छात्र और पाठ्यक्रम तालिका के साथ दो विदेशी कुंजी मैप की गई हैं।

तार्किक रूप से, स्कीमा सही है लेकिन मैं डेटाबेस में एक गलती कर रहा था, क्योंकि हर तालिका में एक प्राथमिक कुंजी होनी चाहिए।

छात्र-पाठ्यक्रम के लिए मेरी वर्ग परिभाषा थी:

CREATE TABLE [dbo].[Student-Course] (
    [StudentID]  VARCHAR (12) NOT NULL,
    [CourseCode] VARCHAR (10) NOT NULL,
    CONSTRAINT [FK_Student-Course_ToCourse] FOREIGN KEY ([Course_Code]) REFERENCES [dbo].[Course] ([Code]) ON DELETE CASCADE,
    CONSTRAINT [FK_Student-Course_ToStudent] FOREIGN KEY ([Student_ID]) REFERENCES [dbo].[Student] ([Id]) ON DELETE CASCADE
);

मैंने विदेशी कुंजियों की जोड़ी को इस तालिका की प्राथमिक कुंजी बनाया और इसे अद्यतन किया:

CREATE TABLE [dbo].[Student-Course] (
    [StudentID]  VARCHAR (12) NOT NULL,
    [CourseCode] VARCHAR (10) NOT NULL,
    CONSTRAINT [PK_Student-Course] PRIMARY KEY CLUSTERED ([Student_ID] ASC, [Course_Code] ASC),
    CONSTRAINT [FK_Student-Course_ToCourse] FOREIGN KEY ([Course_Code]) REFERENCES [dbo].[Course] ([Code]) ON DELETE CASCADE,
    CONSTRAINT [FK_Student-Course_ToStudent] FOREIGN KEY ([Student_ID]) REFERENCES [dbo].[Student] ([Id]) ON DELETE CASCADE
);

आशा है कि यह कुछ लोगों के लिए समस्याओं को हल करेगा।


इस सवाल के पहले से ही कई जवाब हैं। इसके अलावा, लगभग प्रत्येक उत्तर कहता है "एक प्राथमिक कुंजी जोड़ें" और एक यह कई-से-कई के संदर्भ में करता है।
गर्ट अर्नोल्ड

आप सही हैं, लेकिन कुछ लोग तीसरे तालिका में एक अतिरिक्त प्राथमिक कुंजी आईडी जोड़ते हैं , जो एक अच्छा दृष्टिकोण नहीं है।
सुमेर राजा

जैसा कि दूसरा उत्तर भी कहता है।
गर्ट अर्नोल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.