डेटाटाइम के डेटा प्रकार में डेटाइम 2 के रूपांतरण से परिणाम सीमा के बाहर हो जाते हैं


379

मुझे 5 स्तंभों के साथ एक डेटाटेबल मिला है, जहां एक पंक्ति को डेटा से भरा जा रहा है और फिर लेनदेन के माध्यम से डेटाबेस में सहेजा गया है।

सहेजते समय, एक त्रुटि लौटा दी जाती है:

डेटाटाइम के डेटा प्रकार में डेटाइम 2 प्रकार के रूपांतरण के परिणामस्वरूप आउट-ऑफ-द-रेंज मान होता है

इसका तात्पर्य है, जैसा कि पढ़ा गया है, कि मेरे डेटासेट में एक प्रकार का DateTime2और मेरा डेटाबेस है DateTime; यह गलत है।

दिनांक स्तंभ DateTimeइस तरह सेट है :

new DataColumn("myDate", Type.GetType("System.DateTime"))

सवाल

क्या इसे कोड में हल किया जा सकता है या डेटाबेस स्तर पर कुछ बदलना होगा?

जवाबों:


60

आपके पास कॉलम में किस तरह की तारीखें हैं?

क्या वे सभी प्रकार की सीमा के भीतर फिट होते हैं?


एक तरफ के रूप में, कंस्ट्रक्टर के Typeलिए एक ऑब्जेक्ट प्राप्त करने का सही तरीका कीवर्ड है, जो तेजी से परिमाण का आदेश है।DataColumntypeof

इसलिए, कॉलम बनाने के लिए, आपको लिखना चाहिए

new DataColumn("myDate", typeof(DateTime))

3
मैंने अपने डेटाकोलिम्स बदल दिए और अब टाइपोफ़ का इस्तेमाल किया ... आगे मुझे अपनी समस्या का पता चला। 1 डेटारो था जिसमें एक गलत तारीख थी, जिसने त्रुटि को ट्रिगर किया
Gerbrand

739

ऐसा तब हो सकता है जब आप किसी फ़ील्ड को NULL मान स्वीकार नहीं करते हैं, तो किसी DateTime फ़ील्ड के लिए मान निर्दिष्ट नहीं करते हैं।

उसने मेरे लिए इसे हल कर दिया!


43
एंटिटी फ्रेमवर्क में, यदि आप एक ऐसा क्रिएट किया गया कॉलम जोड़ते हैं जो अशक्त नहीं है, तो अपने EDMX को अपडेट करें, जब आप कोड में मान सेट नहीं कर रहे हैं, तो इस त्रुटि को इस तरह से फेंक सकते हैं
ब्रैड थॉमस

6
यह तुम्हारे लिए क्या तय किया? यह त्रुटि तब दिखाई देती है जब आपके पास एक डिफ़ॉल्ट मूल्य के रूप में गेटडेट () कॉल के साथ एक डेटटाइम फ़ील्ड होता है।
user3046061

15
अगर एनक्यूएल की वजह से एंटिटी फ्रेमवर्क को नजरअंदाज नहीं किया जा सकता है क्योंकि मेरे एसक्यूएल पक्ष में, मेरे पास डिफ़ॉल्ट मान = गेटडेट () है?
जोशिएट्स १

33
मेरा मानना ​​है कि ऐसा होता है EntityFramework एक DateTime.MinValue देखता है जो कि वर्ष 0001 है और SQL डेटाइम सीमा मूल्य से बाहर है, इसलिए यह इस मान को DateTime2 (जो वर्ष 0001 का समर्थन करता है) मान के रूप में भेजता है, इसलिए सम्मिलित / अद्यतन मान्य है, हालाँकि जब SQL इस DateTime2 को DateTime में परिवर्तित करने का प्रयास करता है, तो यह विफल हो जाता है क्योंकि इसके परिणामस्वरूप भिन्न मान होगा। दो समाधान हैं: 1 अपने मॉडल में एक अशक्त डेटाटाइम का उपयोग करें या 2. परिवर्तनों को सहेजने से पहले अपने सभी डेटाटाइम मानों को सही मान दें। आपके द्वारा चुनी गई पसंद इस बात पर निर्भर करती है कि आपके मॉडल में डेटाइम का क्या अर्थ है।
गुइलर्मो रफ़िनो

1
@ GuillermoRuffino के समाधान ने मेरे लिए काम किया। अपने सभी क्षेत्रों का निरीक्षण करें और उन 0001 वर्ष की प्रविष्टियों को खोजें।
फ्रांसेस्को बी।

158

दोनों DATETIMEऔर DATETIME2नक्शा करने के लिएSystem.DateTime.NET में - आप वास्तव में "रूपांतरण" नहीं कर सकते, क्योंकि यह वास्तव में एक ही .NET प्रकार है।

MSDN दस्तावेज़ पृष्ठ देखें: http://msdn.microsoft.com/en-us/library/bb675168.aspx

SqlDbTypeइन दो के लिए " " के लिए दो अलग-अलग मूल्य हैं - क्या आप उन लोगों को अपने में निर्दिष्ट कर सकते हैंDataColumn परिभाषा ?

लेकिन: SQL सर्वर पर, समर्थित तिथि सीमा काफी भिन्न है।

DATETIME 1753/1/1 को "अनंत काल" (9999/12/31) का समर्थन करता है, जबकि DATETIME2 का समर्थन करता है 0001/1/1 से अनंत काल तक समर्थन करता है।

तो आपको वास्तव में क्या करना है तारीख की वर्ष के लिए जाँच करें - यदि यह 1753 से पहले है, तो आपको इसे कुछ के लिए बदलने की आवश्यकता है 1753 के क्रम में। DATETIME इसे संभालने के लिए SQL सर्वर में कॉलम के है।

न घुलनेवाली तलछट


7
यह उस समस्या की व्याख्या करता है जो मेरे पास थी। हालाँकि ऐसी कुछ स्थितियाँ हैं जहाँ वास्तविक तिथियों को 1753/1/1 से पहले संभाला जाना आवश्यक है, लेकिन कई स्थितियाँ ऐसी हैं जहाँ किसी को डिफ़ॉल्ट मान 0001/1/1 मिलता है जिसके परिणामस्वरूप त्रुटि हो सकती है।
हांग

मैं इस बात की पुष्टि करता हूं कि जब मैं 'डेटाइम' डेटा प्रकार को 'नया डेटटाइम ()' डालने की कोशिश कर रहा था तो मुझे यह अपवाद मिला।
जॉर्ज ओनोफ्रेई

1
मैं अपने C # कोड में DateTime.MinValue के डिफ़ॉल्ट मान को असाइन करने का प्रयास कर रहा था जो एक डेटाबेस को लिखा था। यह उस त्रुटि की व्याख्या करता है जो मुझे मिल रही थी। +1
मकालफुट

मैं एंटिटी फ्रेमवर्क कोड फर्स्ट का उपयोग करता हूं और मैं डेटटाइम प्रॉपर्टी वाले मॉडल का उपयोग करता हूं। DtInit = new System.DateTime(1492, 10, 12),विफल रहता है।
किनिकेत

यह उन स्थितियों में से एक है जहां असली कारण पैच के पीछे छिपा हुआ है ... +1
यूजेनियो मिरो

41

मेरे SQL Server 2008 डेटाबेस में, मैंने एक DateTimeकॉलम को झपकी लेने योग्य नहीं, बल्कि एक GetDate()फ़ंक्शन के साथ डिफ़ॉल्ट मान के रूप में चिह्नित किया था । EF4 का उपयोग करते हुए नई वस्तु सम्मिलित करते समय, मुझे यह त्रुटि मिली क्योंकि मैं स्पष्ट रूप से अपनी वस्तु पर डेटटाइम प्रॉपर्टी पास नहीं कर रहा था। मुझे उम्मीद थी कि एसक्यूएल फ़ंक्शन मेरे लिए तारीख संभाल सकता है लेकिन ऐसा नहीं हुआ। मेरा समाधान इसे उत्पन्न करने के लिए डेटाबेस पर निर्भर होने के बजाय कोड से दिनांक मान भेजना था।

obj.DateProperty = DateTime.now; // C#

2
मदद करने में खुशी। यह कष्टप्रद है क्योंकि आपको लगता है कि EF डेटा संदर्भ यह पता लगा सकेगा कि ऑब्जेक्ट टेबल से बनाए जाने पर फ़ील्ड का डिफ़ॉल्ट मान है।
ग्राहम

मुझे लगता है कि EF के बारे में बहुत सी बातें। मैं POCO स्वयं ट्रैकिंग संस्थाओं का उपयोग कर रहा हूं और यह एक ऐसा क्लस्टर है। मैं कोड पहले मॉडल की जांच करने जा रहा हूं, और अगर वह भी पूरी तरह से बकवास है, तो मैं गंभीरता से

2
मैंने 2 हफ्ते पहले VS लाइव में EF कोड फर्स्ट का डेमो देखा और यह AWESOME, btw देखा।
ग्राहम 18

ये अच्छी खबर है। हम अपने कार्यालय में जल्द ही एक नई परियोजना शुरू कर रहे हैं, और मैं ईएफ-सीएफ और डैपर (एसओ द्वारा उपयोग / बनाए रखा) पर विभाजित हूं । यह संभवतः नीचे आ जाएगा, जो कि WCF सेवा के माध्यम से उपयोग किए जाने वाले ऐप में बेहतर है।

1
नमस्कार, साल पुरानी टिप्पणियाँ! मैं खुद ईएफ कोड-प्रथम के साथ शुरुआत कर रहा हूं और पाया कि मेरे पोको पर मुझे सिर्फ अपने डेटाइम सदस्य को परिभाषित करने की आवश्यकता है Nullable<DateTime>, और कोड में मैं इसे वास्तव में शून्य (01/01/0000 के बजाय) छोड़ सकता हूं। मुझे यह देखकर सुखद आश्चर्य हुआ कि EF से SQL को INSERT पर इस अशक्तता को अनदेखा करना और सर्वर से तारीख का उपयोग करना पता था ( GetDate()) ... हमारे लिए यह तब भी बेहतर था क्योंकि हमें सर्वर पर बेहतर निरंतरता की आवश्यकता थी, बिना घड़ी के अंतर के बारे में चिंता किए वेबसर्वर और एसक्यूएल सर्वर की।
फनका

34

मेरे लिए यह इसलिए था क्योंकि डेटाइम था ..

01/01/0001 00:00:00

इस मामले में आप को ईएफ डेटटाइम ऑब्जेक्ट के लिए शून्य निर्दिष्ट करना चाहते हैं ... मेरे FirstYearRegistered कोड का उपयोग करके एक उदाहरण के रूप में

DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
    vehicleData.DateFirstReg = FirstYearRegistered;
}  

मैं ExcelDataReader का उपयोग करके इस डेटा को पार्स कर रहा हूं और यह 01/01/0001 को वापस आ रहा है जब अमान्य पाठ दर्ज किया गया था (उम्मीद के मुताबिक अपवाद नहीं फेंकता - .GetDateTime (columnIndex) विधि का उपयोग करके)। MinValue की तुलना ने sql में सीमा अपवाद को रोकने के लिए चाल चली।
टॉमी

22

यह एक मुझे पागल कर रहा था। मैं एक अशक्त दिनांक समय ( DateTime?) का उपयोग करने से बचना चाहता था । मेरे पास SQL ​​Server 2008 के datetime2प्रकार का उपयोग करने का विकल्प नहीं था

modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");

मैंने अंततः निम्नलिखित का विकल्प चुना:

public class MyDb : DbContext
{
    public override int SaveChanges()
    {
        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

1
का उपयोग कर [Column(TypeName = "datetime2")]?
किनिकेत

21

कभी-कभी ईएफ को पता नहीं होता है कि एक गणना कॉलम या ट्रिगर के साथ काम कर रहा है । डिजाइन के अनुसार, वे ऑपरेशन एक डालने के बाद ईएफ के बाहर एक मूल्य निर्धारित करेंगे।

संपत्ति में उस कॉलम Computedके edmxलिए ईएफ को निर्दिष्ट करना StoreGeneratedPatternहै।

मेरे लिए यह तब था जब स्तंभ में एक ट्रिगर था जो वर्तमान तिथि और समय सम्मिलित करता था, नीचे तीसरे खंड में देखें।


हल करने के लिए कदम

Visual Studio में Model Browserपृष्ठ को Modelतब Entity Types-> तब खोलें

  1. इकाई और दिनांक समय गुण का चयन करें
  2. चुनते हैं StoreGeneratedPattern
  3. करने के लिए सेट Computed

EF मॉडल ब्राउज़र मॉडल इकाई प्रकार संवाद


इस स्थिति के लिए अन्य उत्तर वर्कअराउंड हैं, कॉलम के उद्देश्य के लिए रिकॉर्ड बनाए जाने के समय / तिथि को निर्दिष्ट करना है, और यह सही समय जोड़ने के लिए ट्रिगर को निष्पादित करने के लिए SQL का काम है। जैसे कि यह एसक्यूएल ट्रिगर:

DEFAULT (GETDATE()) FOR [DateCreated]


ध्यान दें कि मैंने उस समय उपयोग किया था GETDATE()जो मैंने सचमुच किया था। लेकिन हाल ही में एक टिप्पणी थी कि SYSDATETIME()किसी भी DateTime2 संचालन के लिए उपयोग करना चाहिए जो मुझे सच लगता है।
57मेगामैन

10

मैं इसमें भाग गया और अपनी डेटटाइम प्रॉपर्टी में निम्नलिखित शामिल किया:

 [Column(TypeName = "datetime2")]
 public DateTime? NullableDateTimePropUtc { get; set; }

1
using System.ComponentModel.DataAnnotations.Schema; की आवश्यकता है
Kiquenet

9

अगर हम डेट डेट टाइम फील्ड फील्ड को डिफॉल्ट डेट {1/1/0001 12:00:00 AM} पास नहीं करेंगे।

लेकिन यह तिथि इकाई फ्रेम वर्क के अनुकूल नहीं है, इसलिए यह फेंक देगा डेटाटाइम के डेटा प्रकार में डेटाइमटाइम डेटा प्रकार में परिवर्तित जिसके परिणामस्वरूप एक आउट-ऑफ-रेंज मान होगा

बस default DateTime.nowतारीख क्षेत्र के लिए अगर आप किसी भी तारीख से गुजर नहीं रहे हैं।

movie.DateAdded = System.DateTime.Now

मैं कहूंगा कि 'DateTime.Now' पास करना एक डिफ़ॉल्ट मान के रूप में सही होने से बहुत दूर है, और यह भ्रामक है।
बार्टोज़

6

सबसे आसान काम यह होगा कि आप अपने डेटाबेस को बदल कर डेटाइम 2 के बजाय डेटाइम 2 का उपयोग करें। संगतता अच्छी तरह से काम करती है, और आपको अपनी त्रुटियां नहीं मिलेंगी।

आप अभी भी परीक्षण का एक गुच्छा करना चाहते हैं ...

त्रुटि शायद इसलिए है क्योंकि आप वर्ष या कुछ के लिए एक तिथि निर्धारित करने की कोशिश कर रहे हैं - लेकिन यह सब इस बात पर निर्भर करता है कि आपके पास सामान बदलने के लिए नियंत्रण कहां है।


4

मैंने पाया कि यह पोस्ट यह जानने की कोशिश कर रही है कि मुझे निम्नलिखित त्रुटि क्यों हुई जिसे अन्य उत्तरों द्वारा समझाया गया है।

डेटाटाइम के डेटा प्रकार में डेटाइम 2 प्रकार के रूपांतरण के परिणामस्वरूप आउट-ऑफ-द-रेंज मान होता है।

एक अशक्त DateTime ऑब्जेक्ट का उपयोग करें।
सार्वजनिक तिथि खरीद {प्राप्त करें; सेट; }

यदि आप एंटिटी फ्रेमवर्क का उपयोग कर रहे हैं, तो edmx फ़ाइल में ट्रू को न्यूबल प्रॉपर्टी सेट करें

संपादन योग्य फ़ाइल में ** ** के लिए अशक्त संपत्ति सेट करें


3

जैसा कि अय्युक पहले ही इंगित कर चुके हैं, ऐसा तब हो सकता है जब किसी Nullable DateTime फ़ील्ड को NULL मान असाइन किया गया हो । DateTime को DateTime में बदलने पर विचार करें ? या अशक्त < DateTime >। ध्यान रखें कि, यदि आप डिपेंडेंसी प्रॉपर्टी का उपयोग कर रहे हैं , तो यह भी सुनिश्चित करें कि आपकी निर्भरता प्रॉपर्टी का प्रकार भी एक अशक्त डेटाइम प्रकार है।

नीचे डेटटाइम के लिए एक अपूर्ण डेटाइम का वास्तविक जीवन उदाहरण है ? प्रकार समायोजन जो विषम व्यवहार को बढ़ाता है

यहां छवि विवरण दर्ज करें


2

एंटिटी फ्रेमवर्क 4 डेटाइम 2 डेटा प्रकार के साथ काम करता है इसलिए डीबी में एसक्यूएल सर्वर 2008 के लिए संबंधित फ़ील्ड डेटाइम 2 होना चाहिए।

समाधान को प्राप्त करने के लिए दो तरीके हैं।

  1. Entity Framwork 4 में डेटाटाइम डेटा प्रकार का उपयोग करने के लिए आपको edmx-file में "ManManifestToken "को" 2005 "पर स्विच करना होगा।
  2. यदि आप Allow Null के रूप में संबंधित फ़ील्ड सेट करते हैं (यह इसे NULLABLE में कनवर्ट करता है) तो EF डेट ऑब्जेक्ट्स को स्वचालित रूप से डेटाइम के रूप में उपयोग करता है।

1
मैंने अपने डेटाबेस मॉडल (POCO कक्षाएं) के लिए आपके दूसरे बिंदु पर उठाया और सोचा कि कैसे एक अशक्त प्रकार के रूप में एक क्षेत्र निर्धारित किया जाए। यदि किसी को आश्चर्य हो, तो आप तिथि प्रकार के बाद एक प्रश्न चिह्न (?) जोड़कर ऐसा कर सकते हैं। सार्वजनिक दिनांक समय की तरह? StartTime {प्राप्त करें; सेट; } इससे मेरे लिए समस्या हल हो गई। केवल दूसरी चीज जो मुझे करनी थी, वह थी टाइमस्पैन कास्ट को कोड की एक पंक्ति के चारों ओर रखना, जहाँ मैं एक दूसरे से दो अशक्त डेटाइम मान घटा रहा था। जैसे var timeTaken = (TimeSpan) (एंडटाइम - startTime);
सियारन गलाघेर

1

@ आकाश-देव कार्यान्वयन के आधार पर एक बेस क्लास बनाया गया। तो यह आसानी से कई संदर्भों, और संस्थाओं पर लागू किया जा सकता है।

public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class
{
    public BaseDbContext(string connectionString)
        : base(connectionString)
    {
    }
    public override int SaveChanges()
    {

        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<TEntity>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

उपयोग:

public class MyContext: BaseDbContext<MyEntities>
{

    /// <summary>
    /// Initializes a new instance of the <see cref="MyContext"/> class.
    /// </summary>
    public MyContext()
        : base("name=MyConnectionString")
    {
    }
    /// <summary>
    /// Initializes a new instance of the <see cref="MyContext"/> class.
    /// </summary>
    /// <param name="connectionString">The connection string.</param>
    public MyContext(string connectionString)
        : base(connectionString)
    {
    }

     //DBcontext class body here (methods, overrides, etc.)
 }

1

अपने मॉडल वर्ग में संपत्ति पर नीचे उल्लिखित विशेषता जोड़ें।

Attribute = [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Reference = System.ComponentModel.DataAnnotations.Schema

प्रारंभ में मैं इस विशेषता को जोड़ना भूल गया। तो मेरे डेटाबेस में बाधा की तरह बनाया गया था

ALTER TABLE [dbo].[TableName] ADD DEFAULT (getdate()) FOR [ColumnName]

और मैंने इस विशेषता को जोड़ा और अपने db को अपडेट किया तो यह बदल गया

ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_dbo.TableName_ColumnName] DEFAULT (getdate()) FOR [ColumnName]

[DatabaseGenerated (DatabaseGeneratedOption.Computed)]
अजित चंद्रन

0

मेरे मामले में हम डेट डेट को डेट कर रहे थे और हमें यह त्रुटि मिली। क्या होता है कि दिनांक में "अधिक प्रोग्रामर ओरिएंटेड" न्यूनतम 01/01/0001 है, जबकि डेटाइम 1753 पर अटक गया है

हमारे भाग पर डेटा संग्रह त्रुटि के साथ संयोजन करें, और आपको अपना अपवाद मिल जाएगा!


1492 में अमेरिका के, गलत है, तो उपयोग नहीं datetime2
Kiquenet

0

कभी-कभी यह विकास मशीनों पर ठीक काम करता है न कि सर्वरों में। मेरे मामले में मुझे यह बताना था:

<globalization uiCulture="es" culture="es-CO" />

Web.config फ़ाइल में।

मशीन (सर्वर) में टाइमज़ोन सही था (सीओ स्थान के लिए) लेकिन वेब ऐप नहीं था। यह सेटिंग हो गई और इसने फिर से काम किया।

बेशक, सभी तारीखों का मूल्य था।

: डी


0

ASP.NET में एक वर्ग के इस कोड को जोड़ने से मुझे काम मिला:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}

0

मुझे इस समस्या के बारे में पता है और आप सभी को भी होना चाहिए:

https://en.wikipedia.org/wiki/Year_2038_problem

SQL में इस समस्या (datetime2) से बचने के लिए एक नया फ़ील्ड प्रकार बनाया गया था।

इस 'दिनांक' फ़ील्ड प्रकार में डेटाइम .Net वर्ग के समान रेंज मान हैं। यह आपकी सभी समस्याओं को हल करेगा, इसलिए मुझे लगता है कि इसे हल करने का सबसे अच्छा तरीका आपके डेटाबेस कॉलम प्रकार को बदल रहा है (यह आपके टेबल डेटा को प्रभावित नहीं करेगा)।


0

निम्नलिखित दो को देखें: 1) इस फ़ील्ड का कोई पूर्ण मान नहीं है। उदाहरण के लिए:

 public DateTime MyDate { get; set; }

इससे हटाएं:

public DateTime MyDate { get; set; }=DateTime.Now;

2) फिर से नया डेटाबेस। उदाहरण के लिए:

db=new MyDb();

क्या होगा यदि आप नहीं चाहते कि DateTime.Now डिफ़ॉल्ट रूप से हो?
सेवेज

यदि आप नहीं चाहते हैं: DateTime.Now। आप उपयोग कर सकते हैं: नया
डेटाइम

0

विरासत में मिली डेटाइम विशेषता के साथ समस्या

यह त्रुटि संदेश अक्सर तब दिखाया जाता है जब किसी गैर-शून्य दिनांक फ़ील्ड में सम्मिलित / अद्यतन समय पर मान शून्य होता है। एक कारण वंशानुक्रम हो सकता है।

यदि आपकी तिथि किसी बेस-क्लास से विरासत में मिली है और आप मैपिंग नहीं करते हैं तो ईएफ यह मूल्य नहीं पढ़ेगा।

अधिक जानकारी के लिए: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and चुनने-रणनीति-दिशा निर्देशों


0

मुझे यह त्रुटि तब दिखाई दी जब मैं एक पेज usnig ASP.Net MVC को संपादित करना चाहता था। क्रिएट करते समय मुझे कोई समस्या नहीं हुई लेकिन अपडेट करने वाले डेटाबेस ने मेरी डेट क्रिएट की गई प्रॉपर्टी को सीमा से बाहर कर दिया!

जब आप नहीं चाहते कि आपकी DateTimeसंपत्ति अशक्त हो और यह जांचना न चाहें कि इसका मूल्य sql DateTime श्रेणी में है ( @Html.HiddenForयह मदद नहीं करता है!), तो बस static DateTimeसंबंधित वर्ग (नियंत्रक) के अंदर एक फ़ील्ड जोड़ें और इसे मान दें GET तब काम कर रहा है जब POST यह काम कर रहा है:

public class PagesController : Controller
{
    static DateTime dateTimeField;
    UnitOfWork db = new UnitOfWork();

    // GET:
    public ActionResult Edit(int? id)
    {
        Page page = db.pageRepository.GetById(id);
        dateTimeField = page.DateCreated;
        return View(page);
    }

    // POST: 
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(Page page)
    {
        page.DateCreated = dateTimeField;
        db.pageRepository.Update(page);
        db.Save();
        return RedirectToAction("Index");

    }
}

0

मैं एक साधारण कंसोल ऐप प्रोजेक्ट पर इस समस्या में भाग गया और मेरा त्वरित समाधान है कि इस विधि को चलाकर किसी भी संभव डेटाटाइम दिनांक को एक अशक्त डेटाटाइम में परिवर्तित किया जाए:

static DateTime? ParseDateTime2(DateTime? date)
    {
        if (date == null || date.ToString() == "1/1/0001 12:00:00 AM")
        {
            return null;
        }
        else
        {
            return date;
        }
    }

यह निश्चित रूप से एक पूरी तरह से व्यापक तरीका नहीं है, लेकिन यह मेरी जरूरतों के लिए काम करता है और शायद यह दूसरों की मदद करेगा!


0

DB में पुनः स्वरूप की जाँच करें। उदाहरण के लिए मेरे DB में डिफ़ॉल्ट मान या बाइंडिंग है(((1)/(1))/(1900))

System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);

यहां छवि विवरण दर्ज करें


-1

आपके पास दिनांक स्तंभ होगा जो 1/1/1001 की तरह अनुमत डैटाइम के न्यूनतम मूल्य को घटाने के लिए निर्धारित किया गया था।

इस समस्या को दूर करने के लिए आप उचित डेटाइम मान को उर प्रॉपर्टी में सेट कर सकते हैं और साथ ही एक और जादुई संपत्ति सेट करें जैसे कि IsSpecified = true।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.