2013-06-16 3 views
17

मैं अपने DB में कुछ स्थिरांक बीज के कोशिश कर रहा हूँ:इकाई की रूपरेखा Codefirst साथ संग्रहीत TimeSpan - SqlDbType.Time अतिप्रवाह

context.Stages.AddOrUpdate(s => s.Name, 
            new Stage() 
            { 
             Name = "Seven", 
             Span = new TimeSpan(2, 0, 0), 
             StageId = 7 
            }); 
context.Stages.AddOrUpdate(s => s.Name, 
            new Stage() 
            { 
             Name = "Eight", 
             Span = new TimeSpan(1, 0, 0, 0), 
             StageId = 8 
            }); 

यह मेरा बीज के भीतर है() एफई Codefirst माइग्रेशन के लिए कार्य करते हैं।

System.Data.UpdateException:: यह निम्नलिखित के साथ स्टेज आठ में विफल रहता है प्रविष्टियों को अपडेट करते समय एक त्रुटि हुई। विवरण के लिए आंतरिक अपवाद देखें। ---> सिस्टम। ओवरफ्लो अपवाद: SqlDbType.Time अतिप्रवाह। मान '1.00: 00: 00' सीमा से बाहर है। 00: 00: 00.0000000 और 23: 59: 59.9 99 99 99 के बीच होना चाहिए।

मैं ईएफ का उपयोग करके टाइम्स पैन क्यों स्टोर नहीं कर पाऊंगा? मैं वास्तव में आशा है कि मैं कुछ मूर्खतापूर्ण समय-टिक रूपांतरण करने की ज़रूरत नहीं है दोनों यहाँ समाप्त होती है पर ...

उत्तर

5

इस पंक्ति में:

Span = new TimeSpan(1, 0, 0, 0) 

आप इस निर्माता का उपयोग कर रहे:

public TimeSpan(int days, int hours, int minutes, int seconds); 

तो आप वास्तव में, एक TimeSpan 24 से अधिक घंटे बना रहे हैं जब से तुम days पैरामीटर के लिए 1 गुजर रहे हैं, जबकि अपनी अंतर्निहित डेटाबेस प्रकार Time जो केवल 00 के बीच मान स्वीकार करता है: 00-23: 59।

यह बताना मुश्किल है कि वास्तव में आपके पास TimeSpan 1 दिन के साथ है, या यह सिर्फ एक टाइपो है।

यदि आप वास्तव में 24 घंटे से अधिक TimeSpan चाहते हैं, तो मुझे लगता है कि आपको अपने क्षेत्र को किसी अन्य डेटाबेस प्रकार (जैसे SmallDateTime) पर मैप करना होगा।

Span = new TimeSpan(1, 0, 0), 
+5

जब से लॉजिकल टाइमपैन 24 घंटों तक सीमित होता है? विशेष रूप से 'टाइमस्पेन' वर्ग के रूप में मूर्ख [कई दिनों का समर्थन करता है] (https://msdn.microsoft.com/en-us/library/85ydwftb%28v=vs.110%29.aspx)। – Diederik

+1

@Diederik, उत्तर में कहीं भी यह कहता है कि यह 'टाइमस्पेन' है जो 24 घंटे तक सीमित है, यह मैप किए गए डेटाबेस कॉलम ('टाइम') है जो सीमित है।यह गलत मैपिंग के बारे में है, न कि 'टाइमस्पेन' सीमा (जो निश्चित रूप से 1 दिन से अधिक का समर्थन कर रहा है)। – haim770

+7

बिल्कुल। डीबी प्रकार मैपिंग सिर्फ सादा गलत है, क्योंकि 'टाइमस्पेन' डेटा डीबी प्रकार 'टाइम' में नहीं है। यह एक बग की तरह लगता है। – Diederik

2

समस्या, जैसा कि पहले उल्लेख के रूप में, इस तथ्य एफई समय, जिसमें 24 घंटे तक ही सीमित है के लिए TimeSpan वर्ग नक्शे है जो:

यदि यह महज एक टाइपो त्रुटि है, बस के लिए अपनी लाइन बदल जाते हैं।

आप अधिक से अधिक से कम 24 घंटे की एक समयावधि स्टोर करने के लिए की जरूरत है, मैं निम्नलिखित दो तरीकों में से एक सुझाव है:

1) एक समयावधि के विभिन्न तत्वों के लिए पूर्णांक गुणों के साथ एक TimeSpan इकाई बनाएँ, कुछ ऐसा:

public class Timespan 
{ 
    public Int64 Id { get; set; } 

    public Int16 Years { get; set; } 

    public int Months { get; set; } 

    public Int64 Days { get; set; } 

    public Int64 Hours { get; set; } 

    public Int64 Minutes { get; set; } 
} 

बस अपनी कस्टम टाइम्सpan इकाई में लागू इकाई में एक विदेशी संदर्भ जोड़ें।

2) कुछ 0 मूर्खतापूर्ण समय-प्रति-परिवर्तन रूपांतरण करें, जैसा कि blog post में बताया गया है।

+3

विकल्प 2 विकल्प 1 की तुलना में बहुत कम मूर्ख है जो डिस्क स्थान की बर्बादी है। 64 बिट के बजाय 304 बिट? पागल ... :) –

+0

'टाइमस्पेन' और 'लम्बा', 'टाइमस्पेन' ** के बीच कोई "रूपांतरण" नहीं है ** ** पहले से ही 'लंबा' है, यह आंतरिक रूप से इस तरह से संग्रहीत है, [अपने लिए देखें] (http : //referencesource.microsoft.com/#mscorlib/system/timespan.cs,97)। – Shimmy

21
[Obsolete("Property 'Duration' should be used instead.")] 
    [Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    public long DurationTicks { get; set; } 

    [NotMapped] 
    public TimeSpan Duration 
    { 
#pragma warning disable 618 
     get { return new TimeSpan(DurationTicks); } 
     set { DurationTicks = value.Ticks; } 
#pragma warning restore 618 
    } 
+2

ग्रेट उत्तर, अवधि – Brent

+3

पर एक [नोटमैपड] विशेषता जोड़ने के लायक हो सकता है यह प्रगा चेतावनी दमन द्वारा परेशान लोगों के लिए सहायक हो सकता है: http://stackoverflow.com/questions/968293/c-sharp-selectively-suppress- कस्टम- अप्रचलित चेतावनियां –

+0

ब्रेंट, वास्तव में यदि आप अवधि कॉलम में [नोटमैपड] विशेषता जोड़ते हैं, तो कॉलम गिरा दिया जाएगा, जो इस कॉलम में मौजूद सभी मौजूदा डेटा मिटा देगा और अवधि टिक्स कॉलम में 0 – Artemious

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