मैं कैसे सुनिश्चित कर सकता हूं कि SQL से SQL को ओवरराइड या गैर-शून्य डीबी डिफ़ॉल्ट मानों का उल्लंघन नहीं करता है?

मेरे पास इन फ़ील्ड के साथ एक तालिका के साथ एक SQL सर्वर डीबी है:

  1. डिफ़ॉल्ट मान 1 के साथ bit , न्यूल
  2. एक smalldatetime डिफ़ॉल्ट मान gettime() , न्यूल के साथ।
  3. कोई int बिना डिफ़ॉल्ट मान के, पहचान , न्यूल

जब मैं इस तालिका के लिए SQL से SQL उत्पन्न करता हूं, तो निम्न होता है:

  1. bit को कोई विशेष उपचार नहीं दिया गया है।
  2. smalldatetime को कोई विशेष उपचार नहीं दिया गया है।
  3. int को IsDbGenerated के रूप में चिह्नित किया गया है।

इसका मतलब है कि जब मैं लिंक से एसक्यूएल का उपयोग कर आवेषण करता हूं, तो निम्न होगा:

  1. The bit will be sent as 0, overriding the default value. Right?
  2. The smalldatetime will be sent as an uninitialized System.DateTime, producing an error in SQL server since it doesn't fall with the SQL Server smalldatetime range. Right?
  3. The IsDbGenerated int will not be sent; the DB will generate a value which Linq to SQL will then read back.

What changes do I have to make to make this scenario work?

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

संपादित करें: उत्तर लगता है कि यह मौजूदा लिंक से SQL में एक सीमा है।

14
डुप्लिकेट: stackoverflow.com/q/1120858/11683 (बंद करने के लिए मतदान नहीं, दोनों समान रूप से उपयोगी हैं)।
जोड़ा लेखक GSerg, स्रोत

4 उत्तर

लिनक्स-टू-एसक्यूएल जेनरेटेड क्लास डिफॉल्ट वैल्यू कॉन्स्ट्रिएंट्स नहीं लेते हैं।

शायद भविष्य में, लेकिन समस्या यह है कि बाधाएं हमेशा सामान्य मान नहीं होती हैं, वे स्केलर फ़ंक्शंस जैसे GetDate() भी हो सकती हैं, इसलिए linq को किसी भी तरह से उनको अनुवाद करने का तरीका पता होना चाहिए। संक्षेप में, यह भी कोशिश नहीं करता है। यह एक बहुत ही डेटाबेस-विशिष्ट प्रकार की चीज है।

  • आप इकाई आंशिक कक्षाएं बनाने के लिए कोड जनरेटर लिख सकते हैं जहां आप डिफ़ॉल्ट मान कोष्ठक निकाल सकते हैं।
  • वैकल्पिक रूप से आपका व्यवसाय परत कोड किसी xml फ़ाइल से रचनाकारों में डिफ़ॉल्ट सेट कर सकता है, और आपको बस इतना करना है कि xml फ़ाइल को अद्यतित रखें।
  • रचनाकारों में काम करने के बजाय, आप SQL में अनुकरण कर सकते हैं और डेटाबेस में परिवर्तन सबमिट करने से पहले चेंजसेट का निरीक्षण करके डिफ़ॉल्ट मान जोड़ सकते हैं।

The issue you are having is described at length in CodeProject - Setting Default Values for LINQ Bound Data

5
जोड़ा
"linq किसी भी तरह से यह जानना होगा कि उनको अनुवाद कैसे करें" - क्यों? यह सिर्फ बनाने/अपडेट पर कुछ भी गुजरने की अनुमति नहीं दे सकता है, और बाद में उन्हें वापस पढ़ सकता है। इस तरह लिंकड पक्ष पर उनकी पढ़ने-योग्य स्थिति को छोड़कर, IsDbGenerated फ़ील्ड काम करते हैं।
जोड़ा लेखक bzlm, स्रोत
निश्चित रूप से, यह इसकी अनुमति दे सकता है, लेकिन यह नहीं करता है। IsDbGenerated समय पर इस बिंदु पर महत्वपूर्ण कॉलम के लिए है। "Linq किसी भी तरह ..." सिर्फ मेरी राय है कि यह क्यों हो सकता है।
जोड़ा लेखक Robert Paulson, स्रोत
ऐसा लगता है कि IsDbGenerated अब भी गैर कुंजी कॉलम के लिए उपलब्ध है।
जोड़ा लेखक Make it useful Keep it simple, स्रोत

मैंने एक ही समस्या में भाग लिया है, bzlm, और एक ही निष्कर्ष पर आते हैं। लिंक से एसक्यूएल के साथ काम कर रहे डीबी-असाइन किए गए डिफ़ॉल्ट मानों के साथ गैर-शून्य फ़ील्ड प्राप्त करने का कोई अच्छा तरीका नहीं है।

मेरे आस-पास के काम के साथ एक कोडडिफॉल्ट() विधि को कोडप्रोजेक्ट से जुड़े रॉबर्ट पॉलसन के समान ही जोड़ना है और इसे मेरी टेबल इकाई बेस क्लास के डिफ़ॉल्ट कन्स्ट्रक्टर में कॉल करना है। यह मेरे लिए अच्छा काम करता है, क्योंकि 9 5% समय, मैं 0, खाली स्ट्रिंग, या गेटडेट() सेट कर रहा हूं।

3
जोड़ा
हा, यहाँ भी ऐसा ही है। धन्यवाद!
जोड़ा लेखक bzlm, स्रोत

This means that when I make inserts using Linq to SQL, the following will happen:

  1. The bit will be sent as 0, overriding the default value. Right? - Correct
  2. The smalldatetime will be sent as an uninitialized System.DateTime, producing an error in SQL server since it doesn't fall with the SQL Server smalldatetime range. Right? - What is sent is DateTime.MinValue
  3. The IsDbGenerated int will not be sent; the DB will generate a value which Linq to SQL will then read back. - If DB generated is set then the value is created by the database, if not then Linq expects the user to set the value.

यदि आप स्वचालित गुणों का उपयोग नहीं कर रहे हैं, तो आपकी सबसे अच्छी शर्त ऑब्जेक्ट के निर्माता या निजी फ़ील्ड पर सेट करना है।

2
जोड़ा
यह संभव है लेकिन आप तथ्य के बाद उन्हें बदल नहीं सकते हैं। यदि आप उन्हें बदलने में सक्षम होना चाहते हैं तो आपको उन्हें कन्स्ट्रक्टर में बनाना चाहिए।
जोड़ा लेखक David Basarab, स्रोत
कन्स्ट्रक्टर का उपयोग न करें, इसके लिए ऑनक्रेट नामक एक विशेष आंशिक विधि है। यह प्रश्न देखें: stackoverflow.com/questions/82409/&hellip द्वारा उत्पन्न कक्षा में खाली कन्स्ट्रक्टर को ओवरराइड करने का कोई तरीका है;
जोड़ा लेखक Sam, स्रोत
ऐसा लगता है जैसे आप कह रहे हैं कि SQL सर्वर मानों में फ़ील्ड पर डिफ़ॉल्ट मान लिंक से SQL के साथ गठबंधन करना संभव नहीं है। क्या ये सही है?
जोड़ा लेखक bzlm, स्रोत
क्षमा करें, मुझे समझ में नहीं आता है। क्या संभव है? और क्या तथ्य के बाद बदला नहीं जा सकता है? क्या लिंक से SQL को एक सम्मिलित करना संभव है और डीबी में निर्दिष्ट "डिफ़ॉल्ट मान" का उपयोग किया जा सकता है?
जोड़ा लेखक bzlm, स्रोत
असल में, यह ऑनक्रेटेड है। Longhorn213 के जवाब बहुत भ्रमित हैं, और उन्होंने मेरे मूल प्रश्न को भी किसी कारण से संपादित नहीं किया है। बस उसे अनदेखा करें।
जोड़ा लेखक bzlm, स्रोत

आप अपने डेटाकॉन्टेक्स्ट (आंशिक वर्ग) के लिए एक और फ़ाइल बना सकते हैं और फिर अपनी संपत्तियों का निरीक्षण करने और उचित मूल्यों को आवंटित करने के लिए सम्मिलन और अद्यतन YOURENTITY आंशिक तरीकों का उपयोग कर सकते हैं। अपने कोड के बाद ExecuteDynamicInsert या ExecuteDynamicUpdate को कॉल करें और आप सेट हैं।

0
जोड़ा
असल में, बीएलएल में ऐसा करने का अनुशंसित तरीका इकाई के लिए आंशिक विधि ऑनक्रेटेड() को लागू करना है, न कि आपके द्वारा सुझाए गए तरीके से। फिर भी, यह मेरे प्रश्न के लिए प्रासंगिक नहीं है। मेरा प्रश्न SQL सर्वर में डिफ़ॉल्ट मानों के बारे में है, बीएलएल में नहीं।
जोड़ा लेखक bzlm, स्रोत