7

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

विशेष रूप से मेरे पास एक पुष्टिकर्ता उपयोगकर्ता के साथ 0..1 से कई के साथ एक अलार्म इकाई है। (उपयोगकर्ता कई अलार्म की पुष्टि कर सकता है, लेकिन केवल अलार्म या एक उपयोगकर्ता द्वारा अलार्म की पुष्टि की जा सकती है)।

इकाई परिभाषाओं (सरलीकृत):

Alarm properties 
Id  Int32 non-nullable identity entity key 
UserId Int32 nullable concurrency mode fixed 
Alarm navigation properties 
User 0..1 multiplicity 

User properties 
Id  Int32 non-nullable identity entity key 
Name String non-nullable 

मेरी स्वयं ट्रैकिंग इकाई में इस बात की पुष्टि प्रयोक्ता आईडी, स्वत: जनरेट एक Nullable उम्मीद बस के रूप में के रूप में है, लेकिन अगर मैं एक पहले से ही लगातार अलार्म करने के लिए एक उपयोगकर्ता को निर्दिष्ट और ApplyChanges चलाएं, स्वयं ट्रैकिंग संदर्भ एक्सटेंशन ईएफ संदर्भ (संदर्भ एक्सटेंशन में SetValue में) में मूल मान (शून्य) सेट करने का प्रयास करता है, लेकिन चुपचाप इसे छोड़ देता है क्योंकि EdmType का ClrEquivalentType एक गैर-शून्यणीय Int32 है।

स्वत: निर्मित एक्सटेंशन कोड:

private static void SetValue(this OriginalValueRecord record, EdmProperty edmProperty, object value) 
    { 
     if (value == null) 
     { 
      Type entityClrType = ((PrimitiveType)edmProperty.TypeUsage.EdmType).ClrEquivalentType; 
      if (entityClrType.IsValueType && 
       !(entityClrType.IsGenericType && typeof(Nullable<>) == entityClrType.GetGenericTypeDefinition())) 
      { 
       // Skip setting null original values on non-nullable CLR types because the ObjectStateEntry won't allow this 
       return; 
      } 
     } 

     int ordinal = record.GetOrdinal(edmProperty.Name); 
     record.SetValue(ordinal, value); 
    } 

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

क्या गैर-विदेशी विदेशी कुंजी/आदिम प्रकार ईएफ के लिए स्वयं ट्रैकिंग इकाइयों में पूरी तरह से समर्थित नहीं हैं? यदि नहीं, तो क्या मुझे नल की बजाय डमी इकाइयों का उपयोग करने के लिए मजबूर किया गया है या क्या अन्य कामकाज हैं?

अद्यतन मैं STE बिना इस समस्या का पुन: पेश करने की कोशिश की है, लेकिन सादे एफई नल विदेशी चाबी के लिए अच्छी तरह से आशावादी संगामिति संभाल करने लगता है, तो यह एक STE समस्या है, न कि एफई समस्या है। स्वयं ट्रैकिंग इकाइयों के साथ कई समस्याएं हैं, इसलिए यह आश्चर्य की बात नहीं है कि यहां एक गड़बड़ है। अगर मुझे कोई कामकाज मिल जाए जो एसटीई टी 4 स्क्रिप्ट में कार्यान्वित किया जा सकता है तो मैं इसे यहां पोस्ट करूंगा।

उत्तर

1

बिल ह्यूथ ने MSDN पर एक कार्यशील पैच पोस्ट किया।

0

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

+0

मुझे पूरा यकीन है कि मेरी प्राथमिक कुंजी ठीक है। समस्या तब होती है जब मैं निरर्थक निर्दिष्ट इकाई को एक नई इकाई में बदलता हूं। यह मूल इकाई संदर्भ (मूल) और कुंजी (शून्य) मूल मान संग्रह में संग्रहीत करने का कारण बनता है। जब लागू करें चेंज को मूल मान कहा जाता है, तो इकाइयों से स्थानांतरित किए गए प्रयासों को ट्रैकर को ईएफ संदर्भ में बदल दिया जाता है, लेकिन चूंकि ईएफ संदर्भ कुंजी के प्रकार को इंट 32 के रूप में परिभाषित करता है और न्यूलबल स्वयं ट्रैकिंग इकाई के रूप में नहीं, इसे शून्य निर्दिष्ट नहीं किया जा सकता है । – Holstebroe

+0

निरर्थक int कॉलम आपके सीएसडीएल में 'int?' के रूप में होना चाहिए, 'int' नहीं। इसे एक नई (पहले अप्रयुक्त) तालिका के साथ आज़माएं; तुम देखोगे। क्या आपने मॉडल बनाया है, क्या आपने शून्यता बदल दी है? –

+0

मैंने कोई प्राथमिक कुंजी "FooEntity" बनाने की कोशिश की, जिसमें कोई प्राथमिक कुंजी नहीं है और फू नामक एक निरर्थक Int32 है। <संपत्ति प्रकार = "Int32" नाम = "फू" Nullable = "true" /> कोई Int32: यह क्या CSDL में उत्पन्न किया जाता है? यहाँ। Int32 में Int32 बदल रहा है? एक त्रुटि का कारण बनता है "मान 'Int32?' अपने डेटाटाइप के अनुसार अमान्य है 'http://schemas.microsoft.com/ado/2008/09/edm:TPropertyType' – Holstebroe

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