2011-12-14 17 views
36

मैं SQL सर्वर पर टाइमस्पेन कोड पहली संपत्ति को मैप करने का प्रयास कर रहा हूं। कोड पहली बार इसे एसक्यूएल में एक समय (7) के रूप में बना रहा प्रतीत होता है। हालांकि .NET में टाइमस्पेन 24 घंटे से अधिक अवधि को संभाल सकता है और मुझे ईवेंट की लंबाई के लिए 24 घंटे से अधिक समय तक स्टोर करने की आवश्यकता है। कोड फर्स्ट के साथ इसे संभालने का सबसे अच्छा तरीका क्या है।मैं एसक्यूएल सर्वर कोड को 24 घंटे से अधिक समय के साथ टाइमस्पेन कैसे मैप करूं?

उत्तर

33

कैसे एसक्यूएल में TimeSpan स्टोर करने के लिए पर मेरे previous question के अनुसार, मैं सेकंड या टिकट के रूप में यह स्टोर करने के लिए सलाह दी गई थी आदि। अंत में मैंने टाइमस्पेन कॉलम को मैप नहीं किया क्योंकि SQL सर्वर में कोई समकक्ष नहीं है। मैंने बस एक दूसरा क्षेत्र बनाया जिसने टाइमस्पेन को टिक्स में परिवर्तित कर दिया और डीबी में संग्रहीत किया। मैं तो TimeSpan भंडारण

public Int64 ValidityPeriodTicks { get; set; } 

[NotMapped] 
public TimeSpan ValidityPeriod 
{ 
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); } 
    set { ValidityPeriodTicks = value.Ticks; } 
} 
+2

यह दृष्टिकोण उप-संबंधी प्रश्नों का कारण बन सकता है जब कोई व्यक्ति नहीं जानता या भूल जाता है कि वैधता अवधि नहीं है। यदि इसका उपयोग LINQ में किया जाता है जहां क्वेरी EF शिकायत नहीं करेगी, तो यह केवल संग्रह को खींच लेगी और इसके ऊपर पुनरावृत्ति होगी। इस कारण से कोई पुरानी फैशन का उपयोग कर सकता है ताकि यह सुनिश्चित किया जा सके कि उन्हें प्रश्नों में उपयोग नहीं किया जाना चाहिए। – StanislawSwierc

+0

सहमत हुए, मैंने अपने समाधान में अपना कोड समायोजित किया है ताकि कार्यान्वयन स्पष्ट हो। – GraemeMiller

+4

मूल्य प्राप्त करने या सेट करने के लिए एक्सटेंशन विधियों का उपयोग करें, और कम गलतफहमी होनी चाहिए। – deerchao

1

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

एक समाधान इस तरह से अपनी इकाई विन्यास में कोई कस्टम स्तंभ प्रकार प्रदान करने के लिए, हो सकता है:

modelBuilder 
.Entity<MyClass>() 
.Property(c => c.MyTimeSpan) 
.HasColumnType("whatever sql type you want to use"); 
+0

ठीक है। यह वही एसक्यूएल प्रकार है जिसका आप उपयोग करना चाहते हैं, मुझे इसकी परवाह है। SQL सर्वर फ़ील्ड में .Net TimeSpan को मैप करने का मानक तरीका क्या है। – GraemeMiller

+0

मैंने सोचा कि यह काफी स्पष्ट था। HasColumnType विधि के स्ट्रिंग पैरामीटर में आपके SQL प्रकार को शामिल होना चाहिए क्योंकि आप इसे एक एसक्यूएल स्क्रिप्ट या टेबल डिज़ाइनर में घोषित करेंगे, जैसे nvarchar (50) या बिट या जो भी आपको चाहिए और नेट डेटा प्रकार के अनुकूल है जो आप उपयोग कर रहे हैं । अपने विशिष्ट मामले में उपयोग करने के लिए सटीक प्रकार क्या है, बस प्रयोग करें। –

+5

मुझे पता था कि कॉलम प्रकार को कैसे बदला जाए, यह मुद्दा नहीं है। ऐसा लगता है कि एसक्यूएल के लिए नेट टाइमस्पैन मैपिंग एक उचित आम समस्या है। मैं विशेष रूप से जानना चाहता था कि एसक्यूएल सर्वर पर नेट टाइमस्पैन को संग्रहीत करने का सबसे अच्छा तरीका क्या है। – GraemeMiller

3

जहाँ तक मुझे पता के रूप में वहाँ नेट के TimeSpan के लिए एसक्यूएल सर्वर में कोई समकक्ष डेटा प्रकार है रोका। निकटतम मैच समय है, लेकिन, जैसा कि आपने बताया है, यह केवल 24 घंटों तक मूल्यों का समर्थन करता है? http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes

निम्नलिखित एमएसडीएन दस्तावेज़ इस http://msdn.microsoft.com/en-us/library/bb386909.aspx का वर्णन करता है। मुझे लगता है कि चूंकि वहां कोई समाधान सूचीबद्ध नहीं है, इसलिए यह वर्तमान में संभव नहीं है।

+1

हाँ, मैंने कभी भी अपने जवाब से अलग नहीं पाया। ईएफ बस SQL ​​सर्वर समय डेटा प्रकार पर मैप करने का अजीब निर्णय लेता है जो स्पष्ट रूप से एक मेल नहीं है – GraemeMiller

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