ReferentialConstraint में एक आश्रित संपत्ति को स्टोर-जनरेट किए गए कॉलम में मैप किया जाता है


98

डेटाबेस में लिखते समय मुझे यह त्रुटि मिलती है:

ReferentialConstraint में एक आश्रित संपत्ति को स्टोर-जनरेट किए गए कॉलम में मैप किया जाता है। कॉलम: 'PaymentId'।

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;
    }

स्कीमा है:

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

जवाबों:


180

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

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


55
मैंने गलती से अपनी एक विदेशी चाबी एक पहचान (ऑटो इंक्रीमेंट) बना ली थी। यह मुझे मिली त्रुटि है।
१२:१२ पर jocull

3
रवींद्र! मैंने संबंध का विदेशी कुंजी भाग SQL Server 2008 प्रबंधन स्टूडियो द्वारा दिए गए डिफ़ॉल्ट के रूप में छोड़ दिया था, जो कि चाइल्ड टेबल का प्राथमिक प्रमुख क्षेत्र था, न कि मैंने जो कॉलम बनाया था, उसमें विदेशी कुंजी मान था।
डकैत

12
यदि आप क्विक वॉच विंडो (यानी (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries) में अपवाद का निरीक्षण करते हैं , तो आप देख सकते हैं कि किस तालिका में प्राथमिक कुंजी संदर्भित है।
C

17
क्या यह अच्छा नहीं होगा यदि ईएफ त्रुटि संदेश सिर्फ यह बताए कि समस्या क्या थी जो थूक-थूक से बाहर निकलने के बजाय थी?
AR

मैंने सभी रिश्तों को एक दृश्य में देखने के लिए इस क्वेरी का उपयोग किया stackoverflow.com/questions/8094156/…
डेव

47

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

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


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

1
EF SQL Server नहीं है। इसकी अपनी सीमा है। सीधे शब्दों में कहें, जहां आप किसी भी डीबी उत्पन्न एफके संपत्ति का उपयोग करते हैं जिसे कॉल किया जाता है PaymentIDऔर इससे निपटते हैं।
लादिस्लाव मृणका

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

यह पंक्ति जोड़ने के बारे में नहीं है बल्कि स्तंभ की परिभाषा के बारे में है। आप उस कॉलम को कैसे सेट करते हैं?
लादिस्लाव मृका

विजुअल स्टूडियो में सिर्फ रिलेशनशिप मॉडल पर क्लिक किया और नाम 'भुगतान' प्राप्त करने के लिए 'भुगतान' टाइप में उपयोग नहीं किया जा सकता है। सदस्य नाम उनके संलग्न प्रकार के समान नहीं हो सकते। कोई विचार
वेल्श किंग

8

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

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

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

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


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

6

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

sql सर्वर तालिका डिज़ाइन प्रवाह

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


2

मेरी समस्या विन्यास में प्राथमिक कुंजी को परिभाषित करने के कारण हुई।

this
   .Property(p => p.Id)
   .HasColumnName(@"id")
   .IsRequired()
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) // this is redundant when you want to configure a One-to-Zero-or-One relationship
   .HasColumnType("int");

इस लाइन को हटा दें

.HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)


उदाहरण http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

यह रिश्ते को परिभाषित करने के लिए पर्याप्त है

// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address) // Mark Address property optional in Student entity
            .WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student

1

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

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

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


1

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

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


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

1

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


1

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


अपने बाहरी DB-पहले EF मॉडल जनरेटर (संदर्भों को धारण करते हुए) को संशोधित करने के बाद कभी भी अपने कस्टम T4 टूल (POCO को पकड़े हुए) को फिर से चलाना न भूलें ... EVER! XD (और साथ ही पागल हो सकता है।-')
Shockwaver

0

मेरे मामले में समस्या दो-तरफ़ा 1-1 संबंध होने के कारण थी:

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

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


0

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


0

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

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

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

तो, मेरी मूल इकाई इस तरह दिखी:

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


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

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

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

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

        }
    }

और फिर उस कोड को बदल दिया जो नए संदर्भ प्रकार के उपयोगकर्ता बनाने के लिए नई इकाई बनाता है

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

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

आशा है कि यह किसी की मदद करता है


0

मेरे मामले में सिर्फ एंटिटी फ्रेमवर्क में Id फ़ील्ड wich FK, जो "कोई नहीं" के बजाय "StoreGeneratedPattern" की भविष्यवाणी "Storeentenerat" सेट की गई थी

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