环境:
- window 10 x64
- vs2019
- .net core 3.1
- efcore 3.1.9
- sqlserver 2008r2
原因:
将0000:01:01 00:00:00
插入到datetime
类型溢出了,因为datetime的范围是0001-01-01
到 9999-12-31
!!!
一、sqlserver支持的日期时间类型(全)
参照:https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/date-and-time-types?view=sql-server-ver15
二、出错原因
当定义如下表时:
create table test(
id int primary key,
createdate datetime
)
如果我们执行下面语句:
insert into test(id,createdate) values(1,'0000-01-01 00:00:00');
name将会得到如下错误:
三、使用efcore快速复现
还是用上面那张表,新建.net core控制台工程TestDateTimeBug
引入包Microsoft.EntityFrameworkCore.SqlServer
:
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.9" />
</ItemGroup>
配置DBContext和实体类,新建文件TestDbContext.cs
,代码如下:
using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestDateTimeBug
{
public class TestDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=test;User Id=sa;Password=123456");
}
}
public DbSet<Test> Tests { set; get; }
}
[Table("test")]
public class Test
{
public int Id { get; set; }
public DateTime CreateDate { get; set; }
}
}
此时,在Program.cs
中书写插入代码:
using System;
namespace TestDateTimeBug
{
class Program
{
static void Main(string[] args)
{
using (var db = new TestDbContext())
{
var test = new Test()
{
Id = 1
};
db.Tests.Add(test);
db.SaveChanges();
};
Console.WriteLine("Hello World!");
}
}
}
当运行后发现报错: