मुझे एक इकाई फ्रेमवर्क इकाई में एक विदेशी कुंजी अद्यतन करने में समस्या है। मैं स्वयं ट्रैकिंग इकाइयों का उपयोग कर रहा हूं और कुछ संबंधों के साथ एक इकाई है जहां विदेशी कुंजी संपत्ति के रूप में भी मौजूद है (ईएफ 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 स्क्रिप्ट में कार्यान्वित किया जा सकता है तो मैं इसे यहां पोस्ट करूंगा।
मुझे पूरा यकीन है कि मेरी प्राथमिक कुंजी ठीक है। समस्या तब होती है जब मैं निरर्थक निर्दिष्ट इकाई को एक नई इकाई में बदलता हूं। यह मूल इकाई संदर्भ (मूल) और कुंजी (शून्य) मूल मान संग्रह में संग्रहीत करने का कारण बनता है। जब लागू करें चेंज को मूल मान कहा जाता है, तो इकाइयों से स्थानांतरित किए गए प्रयासों को ट्रैकर को ईएफ संदर्भ में बदल दिया जाता है, लेकिन चूंकि ईएफ संदर्भ कुंजी के प्रकार को इंट 32 के रूप में परिभाषित करता है और न्यूलबल स्वयं ट्रैकिंग इकाई के रूप में नहीं, इसे शून्य निर्दिष्ट नहीं किया जा सकता है । –
Holstebroe
निरर्थक int कॉलम आपके सीएसडीएल में 'int?' के रूप में होना चाहिए, 'int' नहीं। इसे एक नई (पहले अप्रयुक्त) तालिका के साथ आज़माएं; तुम देखोगे। क्या आपने मॉडल बनाया है, क्या आपने शून्यता बदल दी है? –
मैंने कोई प्राथमिक कुंजी "FooEntity" बनाने की कोशिश की, जिसमें कोई प्राथमिक कुंजी नहीं है और फू नामक एक निरर्थक Int32 है। <संपत्ति प्रकार = "Int32" नाम = "फू" Nullable = "true" /> कोई Int32: यह क्या CSDL में उत्पन्न किया जाता है? यहाँ। Int32 में Int32 बदल रहा है? एक त्रुटि का कारण बनता है "मान 'Int32?' अपने डेटाटाइप के अनुसार अमान्य है 'http://schemas.microsoft.com/ado/2008/09/edm:TPropertyType' –
Holstebroe