2011-06-17 13 views
84

को मैप किया है जब डेटाबेस के लिए लिख मैं इस त्रुटि मिलती है:एक ReferentialConstraint में एक निर्भर संपत्ति एक दुकान-उत्पन्न स्तंभ

एक ReferentialConstraint में एक निर्भर संपत्ति एक दुकान-उत्पन्न स्तंभ के लिए मैप किया गया है। कॉलम: 'भुगतान आईडी'।

public bool PayForItem(int terminalId, double paymentAmount, 
     eNums.MasterCategoryEnum mastercategoryEnum, int CategoryId, int CategoryItemId) 
    { 

     using (var dbEntities = new DatabaseAccess.Schema.EntityModel()) 
     { 
      int pinnumber = 0; 
      long pinid = 1; //getPinId(terminalId,ref pinnumber) ; 
      var payment = new DatabaseAccess.Schema.Payment(); 
      payment.CategoryId = CategoryId; 
      payment.ItemCategoryId = CategoryItemId; 
      payment.PaymentAmount = (decimal)paymentAmount; 
      payment.TerminalId = terminalId; 
      payment.PinId = pinid; 

      payment.HSBCResponseCode = ""; 
      payment.DateActivated = DateTime.Now; 
      payment.PaymentString = "Payment"; 
      payment.PromotionalOfferId = 1; 
      payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid; 

      //payment.PaymentId = 1; 

      dbEntities.AddToPayments(payment); 
      dbEntities.SaveChanges(); 
     } 
     return true; 
    } 

स्कीमा है:

enter image description here

उत्तर

151

क्या यह संभव है कि आपने अपनी तालिकाओं के बीच खराब कॉलम संबंध परिभाषित किया हो? विभिन्न कॉलम और एक ऑटोऑन्यूमेरिक के रूप में सेट किया गया था।

यह मेरे साथ हुआ।

+44

मैंने गलती से मेरी विदेशी कुंजियों में से एक को पहचान (ऑटो वृद्धि) बनाया है। यह मुझे मिली त्रुटि है। – jocull

+3

दोह! मैंने एसक्यूएल सर्वर 2008 प्रबंधन स्टूडियो द्वारा दिए गए डिफ़ॉल्ट के रूप में रिश्ते के विदेशी हिस्से को छोड़ दिया था, जो बाल तालिका का प्राथमिक कुंजी फ़ील्ड था, न कि कॉलम जिसे मैंने विदेशी कुंजी मान रखने के लिए बनाया था। – robaker

+10

यदि आप क्विक वॉच विंडो में अपवाद का निरीक्षण करते हैं (यानी '(ई सिस्टम.डाटा.इन्टिटी.इफ्रास्ट्रक्चर.डीबी अपडेट एक्सेप्शन) .ंट्रीज़ '), आप देख सकते हैं कि कौन सी तालिका में प्राथमिक कुंजी का संदर्भ दिया जा रहा है। –

44

यह त्रुटि का कहना है कि आप असमर्थित संबंध का उपयोग कर रहे हैं या आप अपने मानचित्रण में त्रुटि है। आपका कोड शायद त्रुटि से बिल्कुल असंबंधित है।

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

+1

मैं एक ही जानकारी के साथ एसक्यूएल सर्वर में पंक्ति जोड़ सकता हूं। जब आप स्टोर जेनरेट करते हैं, तो क्या आप एक उदाहरण दे सकते हैं? –

+1

ईएफ SQL सर्वर नहीं है। इसकी अपनी सीमा है। बस यह पता लगाएं कि आप 'भुगतान आईडी' नामक किसी भी डीबी जेनरेट की गई एफके संपत्ति का उपयोग करते हैं और इसके साथ सौदा करते हैं। –

+0

ठीक है हमारे पास एक भुगतान इतिहास है जिसमें भुगतान किया गया है विदेशी कुंजी के रूप में, क्या मुझे वहां एक पंक्ति जोड़ने की ज़रूरत है? –

6

मुझे एक ही समस्या थी। यहां दिए गए उत्तरों के आधार पर मैं इसे ट्रैक करने और इसे हल करने में सक्षम था, लेकिन मुझे नीचे वर्णित एक अजीब मुद्दा था - यह भविष्य में किसी की मदद कर सकता है।

मेरी निर्भर तालिकाओं पर, विदेशी कुंजी कॉलम StoreGeneratedPattern = "पहचान" पर सेट किए गए हैं। मुझे इसे "कोई नहीं" में बदलना पड़ा। दुर्भाग्यवश, डिजाइनर के अंदर ऐसा करने से बिल्कुल काम नहीं हुआ।

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

उसके बाद, समस्या दूर हो गई।

+0

के लिए धन्यवाद यह टिप डिजाइनर में किसी भी स्थान से डिजाइनर में फ़ील्ड को बदलकर इसे ईडीएमएक्स में एक ही स्थान पर बदल दिया गया, लेकिन दूसरी जगह नहीं, इसलिए जब तक मैंने ईडीएमएक्स फ़ाइल को संपादित नहीं किया तब तक मुझे अभी भी त्रुटि मिली। दुर्भाग्य से EntityFramework फिर पागल हो गया और अन्य तालिकाओं में संबंधित इकाइयों को फिर से सम्मिलित करने का प्रयास किया, लेकिन फिर भी, यह उस त्रुटि संदेश को छोड़ने में एक मदद थी। – FTWinston

0

भुगतान और अन्य तालिकाओं/संस्थाओं के बीच संबंधों को दोबारा जांचें। उन लोगों को शामिल करना जिनमें पेमेंटआईड नहीं होना चाहिए क्योंकि वह समस्या है जहां समस्या सबसे ज्यादा छिपी हुई है।

SQL सर्वर प्रबंधन स्टूडियो में विदेशी कुंजी बनाते समय, प्राथमिक कुंजी को डिफॉल्ट किया जाता है, और मूल तालिका बदलते समय यह डिफ़ॉल्ट वापस कर दिया जाता है, इसलिए "टेबल्स और कॉलम" विंडो में सही क्रम में मानों को बदलने के लिए सावधान रहें ।

इसके अलावा, समस्याग्रस्त रिश्ते को ठीक करने के बाद, मॉडल पर एक साधारण "ताज़ा करें" मॉडल से गलत रिश्ते को सही ढंग से हटा नहीं देगा और आपको भी वही त्रुटि मिल जाएगी " ठीक करें", तो इसे रीफ्रेश करने से पहले मॉडल में स्वयं करें। (मैंने इसे कठिन तरीके से पाया।)

1

यदि आपने अपने रिश्तों की जांच की है और वहां अच्छे हैं।

edmx में तालिका हटाएं और फिर डेटाबेस से अद्यतन करें। यह आपको मैन्युअल रूप से अद्यतन करने से बचाएगा।

+0

वास्तव में आपकी सलाह के लिए धन्यवाद, मैंने अपने डेटाबेस को प्रमाणित करने के लिए 1 घंटा बिताया, लेकिन हटा दिए जाने के बाद, सबकुछ ठीक है। –

1

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

0

स्वीकृत उत्तर के अतिरिक्त, यदि आप ईएफ रिवर्स पॉको जनरेटर या कुछ अन्य टूल का उपयोग कर रहे हैं जो आपके पॉको उत्पन्न करते हैं, तो सुनिश्चित करें कि आप पुन: उत्पन्न करें!

2

मुझे एक ही समस्या थी और एसक्यूएल सर्वर में टेबल डिज़ाइन में कुछ खोदने के बाद, मैंने पाया कि गलती से मैंने टेबल की प्राथमिक कुंजी को विदेशी कुंजी के रूप में भी सेट किया है।

sql server table design flow

इस छवि में आप देख सकते हैं कि JobID तालिका के प्राथमिक कुंजी, लेकिन यह भी गलती से विदेशी कुंजी है।

0

मेरे मामले में समस्या एक दो तरह से 1-1 संबंध होने की वजह से किया गया था:

class Foo{ 
[Key] 
Id 
[ForeignKey] 
BarId 
... 
} 
class Bar{ 
[Key] 
Id 
[ForeignKey] 
FooId 
... 
} 

मैं बस दो विदेशी कुंजियों में से एक को हटाने के लिए (आवश्यक नहीं वैसे भी) था।

0

मेरे मामले में यह बस इतना था कि मुझे डेटाबेस पर अनुमतियों को ठीक से सेट नहीं किया गया था। मैंने केवल सेट पढ़ा था और एंटिटी फ्रेमवर्क मुझे एक रेफरेंशियल कॉन्स्ट्रेनट त्रुटि दे रहा था जिसने मुझे फेंक दिया। अतिरिक्त लेखन अनुमतियां जोड़ा गया और सब ठीक था।

0

मेरे मामले में, मेरे पास डेटाबेस जेनरेटेड प्रॉपर्टी थी, और 1 से 1 संबंधित तालिका को संदर्भित करने के लिए एक विदेशीकी नेविगेशन प्रॉपर्टी सेट की गई थी।

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

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

तो, अपने मूल इकाई इस तरह देखा:

private class _navPropInhibitingContext : EF.ApplicationDBContext 
    { 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<MyEntity>() 
       .Ignore(e => e.Path); 

     } 
    } 

और उसके बाद कोड है कि करने के लिए नई इकाई बनाया बदल दिया है:

public partial class MyEntity 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid id{ get; set; } 


    // Navigation 
    [ForeignKey("id")] 
    public PathEntity Path { get; set; } 
} 

तो मैं एक विशेष विरासत में मिला संदर्भ है कि इस तरह देखा बनाया नए संदर्भ प्रकार

using (var specialContext = new _navPropInhibitingContext()) 
    { 
     var dbModel = new MyEntity() 
     { 
      ... 
     }; 

     specialContext.MyEntity.Add(dbModel); 
     await specialContext.SaveChangesAsync(); 
    } 

उम्मीद है कि यह किसी को मदद करता है

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