DbContext এবং SetInitializer ব্যবহার করে কীভাবে ডেটটাইম 2 সীমার বাইরে রূপান্তর ত্রুটিটি ঠিক করবেন?


136

আমি সত্ত্বা ফ্রেমওয়ার্ক 4.1 এর সাথে প্রবর্তিত DbContext এবং কোড ফার্স্ট এপিআই ব্যবহার করছি।

তথ্য মডেল যেমন মৌলিক ধরনের তথ্য ব্যবহার stringএবং DateTime। আমি কয়েকটি ক্ষেত্রে শুধুমাত্র ডেটা টীকাটি ব্যবহার করছি [Required]তবে এটি কোনও DateTimeবৈশিষ্ট্যে নয়। উদাহরণ:

public virtual DateTime Start { get; set; }

DbContext উপশ্রেণী এছাড়াও সহজ এবং দেখতে এরকম হয়:

public class EventsContext : DbContext
{
    public DbSet<Event> Events { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Event>().ToTable("Events");
    }
}

সূচনাকারী হয় আপনি এই বছর বা আগামী বছরের মধ্যে যুক্তিসম্মত মান মডেল সেট তারিখ।

তবে আমি যখন আরম্ভকারী চালাচ্ছি তখন আমি এই ত্রুটিটি এখানে পেয়েছি context.SaveChanges():

একটি ডেটটাইম 2 ডেটা টাইপের রূপান্তরিত হওয়ার ফলে ডেটটাইম ডেটা টাইপের পরিবর্তে সীমার মান হয়। বিবৃতিতে বাতিল করা হয়েছে।

আমি বুঝতে পারছি না কেন এটি কেন ঘটছে কারণ সবকিছু এত সহজ। আমি সম্পাদনা করার জন্য কোনও এডএমএক্স ফাইল না থাকায় এটি কীভাবে ঠিক করবেন তাও নিশ্চিত নই।

কোন ধারনা?


2
এসকিউএল বিবৃতি সন্নিবেশ / আপডেট করতে আপনি কি এসকিউএল প্রোফাইলার ব্যবহার করতে পারেন? এখানে কী চলছে তা বলা শক্ত - আমরা আপনার আরম্ভকারী বা সত্ত্বা দেখতে পাই না। এসকিউএল প্রোফাইলার ইস্যুটির স্থানীয়করণে আপনাকে অনেক সহায়তা করবে।
লাডিস্লাভ শ্রীঙ্কা

1
আমার ক্ষেত্রে আমি একটি টেবিল এবং সম্পাদনা ফর্মটিতে একটি ক্ষেত্র যুক্ত করেছি, বিন্দু অন্তর্ভুক্তগুলি আপডেট করতে ভুলে গিয়েছিলাম এবং আমার ক্ষেত্রটি NULL এ সেট হয়ে যাচ্ছিল। সুতরাং ত্রুটিটি আমার তদারকিকে সংশোধন করতে সহায়তা করেছিল।
স্ট্র্যাটটন

উত্তর:


186

আপনাকে নিশ্চিত করতে হবে যে শুরুটি স্ক্যালডেটটাইম.মিনভ্যালু (জানুয়ারী 1, 1753) এর চেয়ে বড় বা সমান default


14
আমি আমার কিছু প্রারম্ভিক অবজেক্ট একটি নির্ধারিত তারিখ ছাড়াই রেখে দিয়েছিলাম, তাই এটি ডেটটাইম.মিনভ্যালুতে ডিফল্ট হত।
অ্যালেক্স আঙ্গাস

আমি এটাও করেছি ^। অ্যাপ্লিকেশন ব্যবহারকারী অ্যাপ্লিকেশন আইটেমটিতে একটি কাস্টম তারিখের ক্ষেত্র যুক্ত করা হয়েছে এবং তারপরে এটিকে কিছু বোঝার তৈরি করতে ভুলে গিয়েছিল। : (
মাইক ডেভেনি

আমার ক্ষেত্রে, সমস্যাটি নূন্যতম তারিখে ছিল, 01/01/0001 ত্রুটি উত্পন্ন করছিল।
মাচাডো

কিভাবে আমি তারিখটাইম.মিনিভালু চেক করতে পারি?
আনাবিল

1
কিছুটা দেরি হলেও @ আনাবিল আপনার ভিএস / লিনকপ্যাডের তাত্ক্ষণিক উইন্ডোতে কেবল কনসোল.উরাইটলাইন (ডেটটাইম.মিনিভ্যালু) সক্ষম হতে হবে
সিরহামি

22

সহজ। আপনার কোডে প্রথমে ডেটটাইম টাইপ টাইম টাইম? সুতরাং আপনি ডাটাবেসে nlalable ডেটটাইম টাইপ সঙ্গে কাজ করতে পারেন। সত্তার উদাহরণ:

public class Alarme
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        public DateTime? DataDisparado { get; set; }//.This allow you to work with nullable datetime in database.
        public DateTime? DataResolvido { get; set; }//.This allow you to work with nullable datetime in database.
        public long Latencia { get; set; }

        public bool Resolvido { get; set; }

        public int SensorId { get; set; }
        [ForeignKey("SensorId")]
        public virtual Sensor Sensor { get; set; }
    }

6
এটা সবসময় হয় না। {1/1/0001 12:00:00 এএম} এছাড়াও এই ত্রুটিটি উত্থিত করে
ইরান otzap

20

কিছু ক্ষেত্রে DateTime.MinValue(বা সমতুল্য default(DateTime)) অজানা মান নির্দেশ করতে ব্যবহৃত হয়।

এই সহজ এক্সটেনশন পদ্ধতি এই ধরনের পরিস্থিতি পরিচালনা করতে সহায়তা করতে পারে:

public static class DbDateHelper
{
    /// <summary>
    /// Replaces any date before 01.01.1753 with a Nullable of 
    /// DateTime with a value of null.
    /// </summary>
    /// <param name="date">Date to check</param>
    /// <returns>Input date if valid in the DB, or Null if date is 
    /// too early to be DB compatible.</returns>
    public static DateTime? ToNullIfTooEarlyForDb(this DateTime date)
    {
        return (date >= (DateTime) SqlDateTime.MinValue) ? date : (DateTime?)null;
    }
}

ব্যবহার:

 DateTime? dateToPassOnToDb = tooEarlyDate.ToNullIfTooEarlyForDb();

13

যদি ক্ষেত্রটি আপনার নির্দিষ্ট মডেলিংয়ের উদ্বেগগুলির জন্য উপযুক্ত হয় তবে আপনি ক্ষেত্রটিকে অযোগ্য করতে পারেন। একটি নাল তারিখ এমন তারিখে জোর করা হবে না যা এসকিউএল ডেটটাইমের সীমার মধ্যে নয়, যেভাবে কোনও ডিফল্ট মানটি টাইপ করে। অন্য বিকল্পটি হ'ল স্পষ্টভাবে একটি ভিন্ন ধরণের মানচিত্র করা, সম্ভবত এর সাথে,

.HasColumnType("datetime2")

12

যদিও এই প্রশ্নটি বেশ পুরানো এবং ইতিমধ্যে দুর্দান্ত উত্তর রয়েছে, আমি ভেবেছিলাম আমার আরও একটি যুক্ত করা উচিত যা এই সমস্যাটি সমাধান করার জন্য 3 টি ভিন্ন পদ্ধতির ব্যাখ্যা দেয়।

1 ম পন্থা

স্পষ্টভাবে মানচিত্র DateTimeসম্পত্তি public virtual DateTime Start { get; set; }থেকে datetime2টেবিল কলাম সংশ্লিষ্ট হবে। কারণ ডিফল্টভাবে EF এটিকে মানচিত্র করবে datetime

এটি সাবলীল এপিআই বা ডেটা টিকা দ্বারা করা যেতে পারে।

  1. সাবলীল এপিআই

    ডিবিকন্টেক্সট ক্লাসে OnModelCreatingসম্পত্তি ওভারাইড এবং কনফিগার করুন Start(ব্যাখ্যা কারণে এটি এন্টি ক্লাস শ্রেণীর সম্পত্তি))

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Configure only one property 
        modelBuilder.Entity<EntityClass>()
            .Property(e => e.Start)
            .HasColumnType("datetime2");
    
       //or configure all DateTime Preperties globally(EF 6 and Above)
        modelBuilder.Properties<DateTime>()
            .Configure(c => c.HasColumnType("datetime2"));
    }
  2. ডেটা টিকা

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

2 য় পন্থা

Startএন্টি ক্লাস কন্সট্রাক্টরের একটি ডিফল্ট মান হিসাবে সূচনা করুন his এটি ভাল যেমন কোনও কারণে Startডাটাবেস শুরুতে সত্তাটি সংরক্ষণ করার আগে মানটি সেট না করা থাকে তবে সর্বদা একটি ডিফল্ট মান থাকবে। ডিফল্ট মান স্ক্যালডেটটাইম.মিনভ্যালু (1 জানুয়ারী, 1753 থেকে 31 ডিসেম্বর, 9999) এর চেয়ে বড় বা তার সমান কিনা তা নিশ্চিত করুন

public class EntityClass
{
    public EntityClass()
    {
        Start= DateTime.Now;
    }
    public DateTime Start{ get; set; }
}

3 য় পন্থা

করুন Startটাইপ nullable হতে DateTime -note ? পর DateTime-

public virtual DateTime? Start { get; set; }

আরও ব্যাখ্যার জন্য এই পোস্টটি পড়ুন


8

যদি আপনার DateTimeবৈশিষ্ট্যগুলি ডাটাবেসে অবিচ্ছিন্ন থাকে তবে DateTime?সংশ্লিষ্ট বস্তুর বৈশিষ্ট্যগুলির জন্য অবশ্যই নিশ্চিত হন বা DateTime.MinValueএসএফকিউ ডেটটাইম টাইপ যা পরিচালনা করতে পারে তার সীমার বাইরে ইএফ স্বাক্ষরবিহীন মানগুলিতে প্রবেশ করবে ।


8

আমার সমাধানটি হ'ল সমস্ত ডেটটাইম কলামগুলি ডেটটাইম 2 এ স্যুইচ করা এবং যে কোনও নতুন কলামের জন্য ডেটটাইম 2 ব্যবহার করা। অন্য কথায় EF কে ডেটটাইম 2 ডিফল্টরূপে ব্যবহার করুন। এটি আপনার প্রসঙ্গে অনমোডেল তৈরির পদ্ধতিতে যুক্ত করুন:

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

যে সব ডেটটাইম এবং ডেটটাইম পাবেন? আপনার সমস্ত সত্তার উপর সম্পত্তি।


3

কনস্ট্রাক্টারে স্টার্ট সম্পত্তি আরম্ভ করুন ize

Start = DateTime.Now;

এটি আমার পক্ষে কাজ করেছিল যখন আমি এএসপি। নেট পরিচয় ফ্রেমওয়ার্কের ব্যবহারকারীদের টেবিলে (এসপনেট ব্যবহারকারীরা) প্রথম ফার্স্ট ব্যবহার করে কয়েকটি নতুন ক্ষেত্র যুক্ত করার চেষ্টা করছিলাম। আমি আইডেন্টিমোডেলস.এস.-তে ক্লাস - অ্যাপ্লিকেশন ব্যবহারকারী আপডেট করেছি এবং আমি ডেটটাইম টাইপের সর্বশেষ লোগিন একটি ক্ষেত্র যুক্ত করেছি।

public class ApplicationUser : IdentityUser
    {
        public ApplicationUser()
        {
            CreatedOn = DateTime.Now;
            LastPassUpdate = DateTime.Now;
            LastLogin = DateTime.Now;
        }
        public String FirstName { get; set; }
        public String MiddleName { get; set; }
        public String LastName { get; set; }
        public String EmailId { get; set; }
        public String ContactNo { get; set; }
        public String HintQuestion { get; set; }
        public String HintAnswer { get; set; }
        public Boolean IsUserActive { get; set; }

        //Auditing Fields
        public DateTime CreatedOn { get; set; }
        public DateTime LastPassUpdate { get; set; }
        public DateTime LastLogin { get; set; }
    }

2

ব্যবহারকারী @ andygjp এর উত্তরের ভিত্তিতে, আপনি যদি বেসটি ওভাররাইড করেন তবে এটি ভাল better Db.SaveChanges() পদ্ধতিটি ওভাররাইড করে থাকেন এবং স্কেলডেটটাইম.মিনভ্যালু এবং স্ক্ল্যাডেটটাইম.ম্যাক্সভ্যালুয়ের মধ্যে না পড়ে এমন কোনও তারিখকে ওভাররাইড করার জন্য একটি ফাংশন যুক্ত ।

এখানে নমুনা কোড

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

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries().Where(x => (x.State == EntityState.Added || x.State == EntityState.Modified)))
        {
            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;
                    }
                }
            }
        }
    }
}

Https://stackoverflow.com/a/11297294/9158120 এ ব্যবহারকারী @ আকাশ-দেবের মন্তব্য থেকে নেওয়া


1

আমার একই সমস্যা ছিল এবং আমার ক্ষেত্রে আমি ডেটটাইম-এর পরিবর্তে নতুন ডেটটাইম () এ তারিখটি সেট করছিলাম ow এখন


0

আমার ক্ষেত্রে এটি ঘটেছিল যখন আমি সত্তাটি ব্যবহার করি এবং এসকিএল টেবিলের ডেটটাইম == গেটডিট () এর ডিফল্ট মান থাকে। সুতরাং আমি এই ক্ষেত্রে একটি মান সেট করতে কি করেছি।


0

আমি ডেটাবেস প্রথম ব্যবহার করছি এবং যখন আমার মধ্যে এই ত্রুটিটি ঘটেছিল তখন আমার সমাধানটি প্রবর্তকমানিফিসিটকেন = "2005" কে এডএমএক্স ফাইলটিতে চাপিয়ে দেওয়া হয়েছিল (এসকিউএল সার্ভার 2005 এর সাথে মডেলগুলিকে সামঞ্জস্যপূর্ণ করে তোলা)। কোড ফার্স্টের জন্য অনুরূপ কিছু সম্ভব কিনা তা জানেন না।


0

একটি লাইন এটি স্থির করে:

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

সুতরাং, আমার কোডে, আমি যুক্ত করেছি:

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

DBContext সাবক্লাস ওভাররাইড অকার্যকর অনমোডেলক্রিয়াটিং বিভাগে একটি লাইন যুক্ত করা কাজ করা উচিত।


0

আমার ক্ষেত্রে, EF6-তে কিছু রিফ্যাক্টরিং করার পরে, আমার পরীক্ষাগুলি মূল পোস্টারের মতো একই ত্রুটি বার্তায় ব্যর্থ হয়েছিল তবে ডেটটাইম ক্ষেত্রগুলির সাথে আমার সমাধানের কোনও সম্পর্ক ছিল না।

সত্তাটি তৈরি করার সময় আমি কেবল একটি প্রয়োজনীয় ক্ষেত্রটি অনুপস্থিত। আমি একবার অনুপস্থিত ক্ষেত্রটি যুক্ত করলে ত্রুটিটি চলে যায়। আমার সত্তার দুটি ডেটটাইম আছে? ক্ষেত্রগুলি কিন্তু তারা সমস্যা ছিল না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.