การแปลงชนิดข้อมูล datetime2 เป็นชนิดข้อมูล datetime ทำให้ค่าอยู่นอกช่วง


379

ฉันมี DataTable กับ 5 คอลัมน์ที่แถวจะถูกกรอกข้อมูลแล้วบันทึกลงในฐานข้อมูลผ่านการทำธุรกรรม

ขณะบันทึกข้อผิดพลาดจะถูกส่งกลับ:

การแปลงชนิดข้อมูล datetime2 เป็นชนิดข้อมูล datetime ทำให้ค่าอยู่นอกช่วง

มันบอกเป็นนัย ๆ ว่าการอ่านข้อมูลของฉันมีประเภทDateTime2และฐานข้อมูลของฉัน a DateTime; ว่าเป็นสิ่งที่ผิด.

คอลัมน์วันที่ถูกตั้งค่าเป็นDateTimeเช่นนี้:

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

คำถาม

สิ่งนี้สามารถแก้ไขได้ในรหัสหรือสิ่งที่จะต้องมีการเปลี่ยนแปลงในระดับฐานข้อมูล?

คำตอบ:


60

คุณมีวันที่ประเภทใดในคอลัมน์

ทั้งหมดนี้พอดีกับช่วงของประเภทหรือไม่


วิธีที่ถูกต้องในการรับTypeวัตถุสำหรับตัวDataColumnสร้างคือtypeofคำหลักซึ่งเป็นคำสั่งที่มีขนาดเร็วกว่า

ดังนั้นในการสร้างคอลัมน์คุณควรเขียน

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

3
ฉันเปลี่ยนฐานข้อมูลและใช้ประเภทของตอนนี้ ... ฉันพบปัญหาเพิ่มเติมอีก มี 1 DataRow ที่มีวันที่ไม่ถูกต้องที่เรียกข้อผิดพลาด
Gerbrand

739

นี้สามารถเกิดขึ้นได้ถ้าคุณไม่ได้กำหนดค่าให้เป็นDateTimeฟิลด์เมื่อข้อมูลไม่ยอมรับโมฆะค่า

นั่นแก้ไขให้ฉัน!


43
ใน Entity Framework หากคุณเพิ่มคอลัมน์ที่สร้างขึ้นซึ่งไม่เป็นโมฆะให้อัปเดต EDMX ของคุณเมื่อคุณไม่ได้ตั้งค่าเป็นรหัสซึ่งสามารถโยนข้อผิดพลาดนี้ด้วยวิธีนี้
Brad Thomas

6
อะไรที่ซ่อมให้คุณ ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อคุณมีฟิลด์ datetime ที่มีการเรียก getdate () เป็นค่าเริ่มต้น
user3046061

15
ทำไม Entity Framework ไม่สามารถเพิกเฉยหาก NULL เพราะด้าน SQL ของฉันฉันมีค่าเริ่มต้น = getdate ()?
JoshYates1980

33
สิ่งที่ฉันเชื่อว่าเกิดขึ้นคือ EntityFramework เห็น DateTime.MinValue ซึ่งเป็นปีที่ 0001 และใน SQL datetime อยู่นอกช่วงค่าดังนั้นจึงส่งค่านี้เป็น DateTime2 (ซึ่งรองรับปี 0001) ดังนั้นการแทรก / อัปเดตจึงถูกต้อง มันล้มเหลวเมื่อ SQL พยายามแปลง DateTime2 นี้เป็น DateTime เพราะสิ่งนี้จะส่งผลให้มีค่าที่แตกต่างกัน วิธีแก้ปัญหาสองอย่างคือ: 1 ใช้วันที่และเวลาที่เป็นโมฆะในแบบจำลองของคุณหรือ 2 เริ่มต้นค่าวันที่และเวลาของคุณทั้งหมดให้เป็นค่าที่ถูกต้องก่อนบันทึกการเปลี่ยนแปลงบริบท ตัวเลือกที่คุณเลือกนั้นขึ้นอยู่กับความหมายของวันที่และเวลาในแบบจำลองของคุณ
Guillermo Ruffino

1
@ โซลูชันของ GuillermoRuffino ใช้ได้สำหรับฉัน ตรวจสอบทุกฟิลด์ของคุณและค้นหารายการ 0001 ปีเหล่านั้น
Francesco B.

158

ทั้งDATETIMEและDATETIME2แมปไปที่System.DateTimeใน. NET - คุณไม่สามารถทำการ "แปลง" ได้จริง ๆ เพราะเป็นประเภท. NET เดียวกันจริงๆ

ดูหน้าเอกสาร MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx

มีค่าที่แตกต่างกันสองค่าสำหรับ " SqlDbType" สำหรับสองค่านี้ - คุณสามารถระบุค่าในDataColumnนิยามของคุณได้หรือไม่?

แต่: บน SQL Server ช่วงวันที่ที่สนับสนุนแตกต่างกันมาก

DATETIMEสนับสนุน 1753/1/1 ถึง "eternity" (9999/12/31) ในขณะที่DATETIME2รองรับ 0001/1/1 ผ่านทาง eternity

ดังนั้นสิ่งที่คุณต้องทำจริงๆคือตรวจสอบปีที่แล้ว - ถ้าก่อนปี 1753 คุณต้องเปลี่ยนเป็นบางอย่างหลังจากปี 1753 เพื่อให้DATETIMEคอลัมน์ใน SQL Server จัดการได้

มาร์ค


7
สิ่งนี้อธิบายถึงปัญหาที่ฉันมี แม้ว่าจะมีบางสถานการณ์ที่ต้องจัดการกับวันที่จริงก่อน 1753/1/1 แต่มีหลายสถานการณ์ที่หนึ่งได้รับค่าเริ่มต้น 0001/1/1 ซึ่งอาจส่งผลให้เกิดข้อผิดพลาด
Hong

ฉันยืนยันว่าเมื่อฉันพยายามแทรก 'DateTime ใหม่ ()' ลงในประเภทข้อมูล 'datetime' ฉันได้รับข้อยกเว้นนี้
George Onofrei

1
ฉันพยายามกำหนดค่าเริ่มต้นของ DateTime.MinValue ในรหัส C # ของฉันที่เขียนไปยังฐานข้อมูล สิ่งนี้อธิบายถึงข้อผิดพลาดที่ฉันได้รับ +1
Mkalafut

ฉันใช้รหัส Entity Framework ก่อนและฉันใช้รุ่นที่มีคุณสมบัติ DateTime DtInit = new System.DateTime(1492, 10, 12),ล้มเหลว
Kiquenet

นี่เป็นหนึ่งในสถานการณ์เหล่านั้นที่เหตุผลแท้จริงถูกซ่อนอยู่หลังแพทช์ ... +1
Eugenio Miró

41

ในฐานข้อมูล SQL Server 2008 ของฉันฉันมีDateTimeคอลัมน์ที่ทำเครื่องหมายว่าไม่เป็นโมฆะ แต่มีGetDate()ฟังก์ชั่นเป็นค่าเริ่มต้น เมื่อแทรกวัตถุใหม่โดยใช้ EF4 ฉันได้รับข้อผิดพลาดนี้เพราะฉันไม่ได้ผ่านคุณสมบัติ DateTime บนวัตถุของฉันอย่างชัดเจน ฉันคาดหวังว่าฟังก์ชั่น SQL จะจัดการกับวันที่สำหรับฉัน แต่มันก็ไม่ได้ โซลูชันของฉันคือส่งค่าวันที่จากรหัสแทนที่จะใช้ฐานข้อมูลเพื่อสร้าง

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

2
ดีใจที่ได้ช่วยเหลือ มันน่ารำคาญเพราะคุณคิดว่าบริบทข้อมูลของ EF จะสามารถค้นพบว่าฟิลด์นั้นมีค่าเริ่มต้นเมื่อสร้างวัตถุจากตาราง
เกรแฮม

ฉันคิดหลายสิ่งเกี่ยวกับ EF ฉันกำลังใช้เอนทิตีการติดตามตัวเองของ POCO และเป็นคลัสเตอร์ดังกล่าว ฉันจะตรวจสอบโค้ดรุ่นแรกและถ้านั่นยังเต็มไปด้วยเรื่องไร้สาระฉันคิดอย่างจริงจังเกี่ยวกับการกลับไปที่ linq to sql และใช้ผู้ทำแผนที่วัตถุเพื่อทำแผนที่อุปกรณ์ประกอบฉากให้กับองค์กรของฉัน ...

2
ฉันเห็นตัวอย่างของรหัส EF First ที่ VS Live 2 สัปดาห์ที่ผ่านมาและมันดูน่ากลัวมาก btw
เกรแฮม

นั่นเป็นข่าวดี เรากำลังจะเริ่มโครงการใหม่ที่สำนักงานของฉันและฉันก็แยกทางกับ EF-CF และdapper (ใช้ / ดูแลโดย SO) มันอาจจะลงมาที่ดีกว่าในแอพที่ใช้ผ่านบริการ WCF

1
สวัสดีความคิดเห็นอายุปี! ฉันเริ่มต้นด้วยรหัส EF ก่อนและพบว่าใน POCO ของฉันฉันแค่ต้องการกำหนดสมาชิกวันที่ของฉันเป็นNullable<DateTime>และในรหัสฉันสามารถปล่อยให้เป็นโมฆะจริง (แทน 01/01/0000) ฉันรู้สึกประหลาดใจเมื่อเห็นว่า EF ถึง SQL รู้ว่าไม่สนใจ null นี้ใน INSERT และใช้วันที่จากเซิร์ฟเวอร์ ( GetDate()) ... สำหรับเรานี่เป็นสิ่งที่ดีกว่าเพราะเราต้องการความสอดคล้องที่ดีขึ้นบนเซิร์ฟเวอร์โดยไม่ต้องกังวลเกี่ยวกับความแตกต่างระหว่างนาฬิกา เว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ sql
Funka

34

สำหรับฉันมันเป็นเพราะวันที่และเวลาเป็น ..

01/01/0001 00:00:00

ในกรณีนี้คุณต้องการกำหนด null ให้กับคุณเป็น Date Date Object ... โดยใช้รหัส FirstYearRegistered ของฉันเป็นตัวอย่าง

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

ฉันแยกวิเคราะห์ข้อมูลนี้โดยใช้ ExcelDataReader และจะส่งคืน 01/01/0001 เมื่อป้อนข้อความที่ไม่ถูกต้อง (ไม่ส่งข้อยกเว้นตามที่คาดไว้ - ใช้วิธี. GetDateTime (columnIndex) การเปรียบเทียบกับ MinValue ทำเคล็ดลับเพื่อป้องกันข้อยกเว้นนอกช่วงใน sql
Tommy

22

อันนี้ทำให้ฉันบ้า ฉันต้องการหลีกเลี่ยงการใช้เวลาวันที่ nullable ( 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")]หรือ?
Kiquenet

21

บางครั้ง EF ไม่ทราบว่าจัดการกับคอลัมน์ที่คำนวณหรือทริกเกอร์ทริกเกอร์โดยการออกแบบการดำเนินการเหล่านั้นจะกำหนดค่านอก EF หลังจากการแทรก

การแก้ไขคือการระบุComputedใน EF edmxสำหรับคอลัมน์นั้นในStoreGeneratedPatternคุณสมบัติ

สำหรับฉันมันคือเมื่อคอลัมน์มีทริกเกอร์ซึ่งแทรกวันที่และเวลาปัจจุบันดูด้านล่างในส่วนที่สาม


ขั้นตอนในการแก้ไข

ใน Visual Studio เปิดModel Browserหน้าจากModelนั้นEntity Types-> จากนั้น

  1. เลือกเอนทิตีและคุณสมบัติเวลาวันที่
  2. เลือก StoreGeneratedPattern
  3. ตั้งค่าให้ Computed

ไดอะล็อก EF Model Browser Model Entity Type


สำหรับสถานการณ์นี้คำตอบอื่น ๆ คือการแก้ไขปัญหาเพื่อให้คอลัมน์มีเวลา / วันที่ที่ระบุเมื่อสร้างเรกคอร์ดและนั่นคืองานของ SQL เพื่อเรียกทริกเกอร์เพื่อเพิ่มเวลาที่ถูกต้อง เช่นทริกเกอร์ SQL นี้:

DEFAULT (GETDATE()) FOR [DateCreated].


โปรดทราบว่าฉันได้ใช้GETDATE()ซึ่งฉันทำอย่างแท้จริงในเวลา แต่มีความคิดเห็นล่าสุดที่ควรใช้SYSDATETIME()สำหรับการดำเนินการ DateTime2 ใด ๆ ซึ่งฉันเชื่อว่าเป็นจริง
ΩmegaMan

10

ฉันพบสิ่งนี้และเพิ่มสิ่งต่อไปนี้ในคุณสมบัติ datetime ของฉัน:

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

1
using System.ComponentModel.DataAnnotations.Schema; เป็นสิ่งจำเป็น
Kiquenet

9

หากเราไม่ผ่านฟิลด์วันที่และเวลาวันที่วันที่เริ่มต้น {1/1/0001 12:00:00 AM} จะถูกส่งผ่าน

แต่วันที่นี้เข้ากันไม่ได้กับงานเฟรมเอนทิตีดังนั้นมันจะส่ง การแปลงของประเภทข้อมูล datetime2 เป็นประเภทข้อมูล datetime และทำให้ค่านอกช่วง

เพียงdefault DateTime.nowไปที่ช่องวันที่หากคุณไม่ผ่านวันที่ใด ๆ

movie.DateAdded = System.DateTime.Now

ฉันจะบอกว่าการผ่าน 'DateTime.Now' เป็นค่าเริ่มต้นนั้นไม่ถูกต้องและค่อนข้างจะทำให้เข้าใจผิด
Bartosz

6

สิ่งที่ง่ายที่สุดคือเปลี่ยนฐานข้อมูลของคุณเพื่อใช้ datetime2 แทน datetime การทำงานร่วมกันได้เป็นอย่างดีและคุณจะไม่ได้รับข้อผิดพลาด

คุณจะยังคงต้องการทำการทดสอบ ...

ข้อผิดพลาดอาจเป็นเพราะคุณกำลังพยายามกำหนดวันที่เป็นปี 0 หรือบางอย่าง - แต่ทุกอย่างขึ้นอยู่กับว่าคุณสามารถควบคุมสิ่งใดบ้าง


4

ฉันพบโพสต์นี้พยายามคิดว่าทำไมฉันถึงได้รับข้อผิดพลาดต่อไปนี้ซึ่งอธิบายโดยคำตอบอื่น ๆ

การแปลงชนิดข้อมูล datetime2 เป็นชนิดข้อมูล datetime ทำให้ค่าอยู่นอกช่วง

ใช้วัตถุ DateTime nullable
วันที่และเวลาสาธารณะ วันที่ซื้อ {รับ; ตั้ง; }

หากคุณใช้เฟรมเวิร์กเอนทิตีตั้งค่าคุณสมบัติที่สามารถ null ได้ในไฟล์ edmx เป็นTrue

ตั้งค่าคุณสมบัติ nullable ในไฟล์ edmx เป็น ** True **


3

เนื่องจากandyukได้ชี้ให้เห็นแล้วสิ่งนี้สามารถเกิดขึ้นได้เมื่อค่า NULLถูกกำหนดให้กับเขตข้อมูลDateTime ที่ไม่สามารถลบล้างได้ พิจารณาเปลี่ยนDateTimeเป็นDateTime หรือไม่ หรือNullable < DateTime > โปรดจำไว้ว่าในกรณีที่คุณใช้ทรัพย์สินที่ต้องพึ่งพาควรตรวจสอบให้แน่ใจว่าประเภทของคุณสมบัติการพึ่งพาของคุณเป็นประเภท DateTime ที่ไม่มีค่าด้วย

ด้านล่างเป็นตัวอย่างชีวิตจริงของDateTimeถึงDateTime ที่ไม่สมบูรณ์หรือไม่ การปรับประเภทที่เพิ่มพฤติกรรมแปลก ๆ

ป้อนคำอธิบายรูปภาพที่นี่


2

Entity Framework 4 ทำงานกับชนิดข้อมูล datetime2 ดังนั้นใน db ฟิลด์ที่เกี่ยวข้องต้องเป็น datetime2 สำหรับ SQL Server 2008

เพื่อให้ได้โซลูชั่นมีสองวิธี

  1. ในการใช้ประเภทข้อมูลวันที่และเวลาใน Entity Framwork 4 คุณจะต้องเปลี่ยน ProviderManifestToken ในไฟล์ edmx เป็น "2005"
  2. ถ้าคุณตั้งค่าฟิลด์ที่สอดคล้องกันเป็น Allow Null (มันจะแปลงเป็น NULLABLE) ดังนั้น EF จะใช้วัตถุวันที่เป็นวันที่และเวลาโดยอัตโนมัติ

1
ฉันเลือกจุดที่สองของคุณสำหรับโมเดลฐานข้อมูลของฉัน (คลาส POCO) และสงสัยว่าจะตั้งค่าฟิลด์เป็นประเภทที่ไม่มีค่าได้อย่างไร ในกรณีที่ทุกคนสงสัยคุณสามารถทำได้โดยเพิ่มเครื่องหมายคำถาม (?) หลังจากพิมพ์วันที่ เช่นวันที่สาธารณะเวลา? StartTime {รับ; ตั้ง; } สิ่งนี้แก้ไขปัญหาให้ฉันได้ สิ่งเดียวที่ฉันต้องทำคือใส่ TimeSpan ลงไปในแถวของโค้ดที่ฉันลบค่า DateTime nullable สองค่าออกจากกัน เช่น var timeTaken = (TimeSpan) (endTime - startTime);
Ciaran Gallagher

1

สร้างคลาสพื้นฐานโดยใช้ @ sky-dev ดังนั้นสิ่งนี้สามารถใช้ได้กับหลายบริบทและเอนทิตี

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)]
Ajith Chandran

0

ในกรณีของฉันเรากำลังส่ง Date ไปที่ Datetime และเราได้รับข้อผิดพลาดนี้ สิ่งที่เกิดขึ้นคือวันที่นั้นมีขั้นต่ำ "มากกว่าโปรแกรมเมอร์ที่มุ่งเน้น" เป็น 01/01/0001 ในขณะที่ Datetime ติดอยู่ที่ 1753

รวมเข้ากับข้อผิดพลาดในการรวบรวมข้อมูลในส่วนของเราและคุณจะได้รับการยกเว้น!


อเมริกาค้นพบในปี 1492 ผิดถ้าไม่ได้ใช้datetime2
Kiquenet

0

บางครั้งมันทำงานได้ดีบนเครื่องที่ใช้ในการพัฒนาไม่ใช่ในเซิร์ฟเวอร์ ในกรณีของฉันฉันต้องใส่:

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

ในไฟล์ web.config

เขตเวลาในเครื่อง (เซิร์ฟเวอร์) นั้นถูกต้อง (ไปยังที่ตั้ง CO) แต่แอปพลิเคชันบนเว็บไม่ได้ การตั้งค่านี้เสร็จสิ้นและทำงานได้ดีอีกครั้ง

แน่นอนว่าทุกวันมีค่า

: D


0

เพิ่มรหัสนี้ในชั้นเรียนใน ASP.NET ทำงาน fort me:

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)

ประเภทฟิลด์ 'วันที่' นี้มีค่าช่วงเดียวกันกับคลาส DateTime .Net มันจะแก้ปัญหาทั้งหมดของคุณดังนั้นฉันคิดว่าวิธีที่ดีที่สุดในการแก้ไขคือการเปลี่ยนประเภทคอลัมน์ฐานข้อมูลของคุณ (จะไม่มีผลกับข้อมูลตารางของคุณ)


0

ตรวจสอบสองสิ่งต่อไปนี้: 1) ฟิลด์นี้ไม่มีค่า NULL ตัวอย่างเช่น:

 public DateTime MyDate { get; set; }

แทนที่เป็น:

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

2) สร้างฐานข้อมูลใหม่อีกครั้ง ตัวอย่างเช่น:

db=new MyDb();

ถ้าคุณไม่ต้องการให้ค่าเป็น DateTime ตอนนี้โดยค่าเริ่มต้น
โหด

หากคุณไม่ต้องการ: DateTime.Now คุณสามารถใช้: DateTime ใหม่ (... , ... , ... )
RainyTears

0

ปัญหากับแอตทริบิวต์ datetime ที่สืบทอดมา

ข้อความแสดงข้อผิดพลาดนี้มักจะแสดงเมื่อเขตข้อมูลวันที่ไม่สามารถลบล้างได้มีค่าว่าง ณ เวลาที่ใส่ / ปรับปรุง สาเหตุหนึ่งอาจเป็นมรดก

หากวันที่ของคุณสืบทอดมาจากคลาสฐานและคุณไม่ได้ทำแผนที่ EF จะไม่อ่านค่าของมัน

สำหรับข้อมูลเพิ่มเติม: 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 ฉันไม่มีปัญหาในขณะที่สร้าง แต่การอัพเดทฐานข้อมูลทำให้คุณสมบัติ DateCreated ของฉันอยู่นอกช่วง!

เมื่อคุณไม่ต้องการDateTimeให้คุณสมบัติเป็น Nullable และไม่ต้องการตรวจสอบว่าค่าอยู่ในช่วง DateTime sql (และ@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

ฉันพบปัญหานี้ในโครงการแอปคอนโซลที่เรียบง่ายและวิธีแก้ปัญหาอย่างรวดเร็วของฉันคือการแปลงวันที่เป็นไปได้ใด ๆ ของ datetime2 เป็นวันที่และเวลาที่ไม่สามารถทำได้โดยการใช้วิธีการนี้:

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

นี่ไม่ใช่วิธีการที่ครอบคลุมอย่างสมบูรณ์ แต่มันใช้งานได้สำหรับความต้องการของฉันและอาจช่วยคนอื่นได้!


0

ตรวจสอบรูปแบบคำขอในฐานข้อมูล เช่นฐานข้อมูลของฉันมีค่าเริ่มต้นหรือมีผลผูกพัน(((1)/(1))/(1900))

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

ป้อนคำอธิบายรูปภาพที่นี่


-1

คุณจะมีคอลัมน์วันที่ซึ่งถูกตั้งค่าเป็นเลอาแทนนค่าขั้นต่ำของ dattime ที่อนุญาตเช่น 1/1/1001

เพื่อแก้ไขปัญหานี้คุณสามารถตั้งค่าวันที่และเวลาที่เหมาะสมให้กับทรัพย์สินและยังตั้งค่าคุณสมบัติวิเศษอื่นเช่น IsSpecified = true

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.