Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

इकाई फ्रेमवर्क - डिफ़ॉल्ट मान sql सर्वर तालिका में सेट नहीं होते हैं

यह उन कुछ मुद्दों में से एक है जो एंटिटी फ्रेमवर्क के साथ समस्याग्रस्त हैं। मान लें कि आपके पास ऐसा वर्ग है जो इस तरह दिखता है:

public class MyEntity
{
    // Id is a PK on the table with Auto-Increment
    public int Id { get; set; }

    // CreatedOn is a datetime, with a default value
    public DateTime CreatedOn { get; set; }
}

अब, आप एक नया तत्व सम्मिलित करना चाहते हैं:

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity())
}

एंटिटी फ्रेमवर्क जानता है कि ईडीएमएक्स में परिभाषा के कारण ऑटो-इन्क्रीमेंट प्राथमिक कुंजी को कैसे संभालना है। यह Id . के लिए कोई मान डालने का प्रयास नहीं करेगा संपत्ति। हालांकि, जहां तक ​​एंटिटी फ्रेमवर्क का संबंध है, CreatedOn है एक मान:डिफ़ॉल्ट DateTime . क्योंकि एंटिटी फ्रेमवर्क यह नहीं कह सकता है "ठीक है, इसका एक मूल्य है लेकिन मुझे इसे अनदेखा करना चाहिए", यह सक्रिय रूप से रिकॉर्ड को CreatedOn के साथ सम्मिलित करेगा। संपत्ति मूल्य, आपकी तालिका पर आपकी कॉलम परिभाषा पर डिफ़ॉल्ट मान को छोड़कर।

ऐसा करने का कोई आसान तरीका नहीं है। आप या तो सक्रिय रूप से CreatedOn . सेट कर सकते हैं DateTime.Now . के लिए संपत्ति जब आप उस वस्तु को सम्मिलित करते हैं। या आप एक इंटरफ़ेस और एक एक्सटेंशन विधि जोड़ी बना सकते हैं:

public interface ICreatedOn
{
    public DateTime CreatedOn { get; set; }
}

public partial class MyEntity : ICreatedOn
{

}

public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
    if(entity != null)
        entity.CreatedOn = DateTime.Now;

    return entity;
}

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity().AsNew())
}   

संपादित करें: इस बिंदु पर विस्तार करने के लिए, यह एक अनसुलझे समस्या का कारण autoincrement के पीछे का अर्थ है। फ़ील्ड और एक फ़ील्ड जिसमें default . है मूल्य बाधा। एक ऑटो-इन्क्रीमेंट फ़ील्ड, परिभाषा के अनुसार, हमेशा सर्वर द्वारा एक बीज और सभी जैज़ का उपयोग करके संभालना चाहिए। आप किसी इंसर्ट पर ऑटो-इन्क्रीमेंट फ़ील्ड के लिए मान निर्दिष्ट नहीं कर सकते जब तक आपने SET IDENTITY INSERT ON . का इस्तेमाल किया है . हालाँकि, एक डिफ़ॉल्ट मान केवल एक संकेत है जो कहता है कि "यदि मैं कोई मान निर्दिष्ट नहीं करता, तो इसका उपयोग करें"। क्योंकि .NET में मान प्रकार शून्य नहीं हो सकते हैं, हमेशा एक मान होगा और एंटिटी फ्रेमवर्क यह अनुमान नहीं लगा सकता कि डिफ़ॉल्ट उस समय उस फ़ील्ड के लिए मान का अर्थ है कि आप चाहते हैं कि यह SQL सर्वर पर डिफ़ॉल्ट हो।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर पर कुशल ISNUMERIC () प्रतिस्थापन?

  2. वीएस 2010 .net 4.0 में इकाई ढांचे का उपयोग करते समय 'डेटाटाइम 2' त्रुटि

  3. कोई पंक्ति नहीं लौटाने वाली क्वेरी के लिए डिफ़ॉल्ट पंक्ति कैसे सेट करें?

  4. सीएसवी से एसक्यूएल थोक आयात

  5. कॉलम मानों के आधार पर सशर्त आदेश