C# 如何使用实体框架codefirst在数据库中插入空Datetime

C# 如何使用实体框架codefirst在数据库中插入空Datetime,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我的模型包含一个可为空的datetime属性 我想在该字段中插入一个空值,但EF插入的是通常的00/00/0001日期,而不是空值,这也给了我一个错误 我正在使用microsoft sql server 2012 告诉我错误 将datetime2数据类型转换为datetime数据类型导致值超出范围。\r\n语句已终止 这是因为sql server datetime不能有00/00/0001,EF在数据库中插入空datetime后会自动生成该值 我想在数据库中插入null EF插入通常的00/00

我的模型包含一个可为空的datetime属性

我想在该字段中插入一个空值,但EF插入的是通常的00/00/0001日期,而不是空值,这也给了我一个错误

我正在使用microsoft sql server 2012

告诉我错误

将datetime2数据类型转换为datetime数据类型导致值超出范围。\r\n语句已终止

这是因为sql server datetime不能有00/00/0001,EF在数据库中插入空datetime后会自动生成该值

我想在数据库中插入null

EF插入通常的00/00/0001日期,而不是null

这一点都不寻常。EF 6.1在自己的设备上插入
NULL

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var DataContext = new StackOverflowContext();

            DateTime? date = null;
            var entity = new Model()
            {
                GoDate = date
            };

            DataContext.Models.Add(entity);
            DataContext.SaveChanges();
        }
    }

    class Model
    {
        public int ModelId { get; set; }

        public DateTime? GoDate { get; set; }
    }

    class StackOverflowContext : DbContext
    {
        public DbSet<Model> Models { get; set; }
    }
}
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
var DataContext=new StackOverflowContext();
DateTime?date=null;
var实体=新模型()
{
日期
};
DataContext.Models.Add(实体);
DataContext.SaveChanges();
}
}
类模型
{
公共int ModelId{get;set;}
公共日期时间?GoDate{get;set;}
}
类StackOverflowContext:DbContext
{
公共数据库集模型{get;set;}
}
}

您的映射或数据库架构很可能是错误的。

您可以使用以下方法:

 Nullable<DateTime> date=null;
 var entity = new Model()
            {
                GoDate = date
            };

   DataContext.Models.Add(entity);
   DataContext.SaveChanges();
Nullable date=null;
var实体=新模型()
{
日期
};
DataContext.Models.Add(实体);
DataContext.SaveChanges();

或者您可以这样设置:

var entity= new Model
{
    GoDate = (DateTime?) null
}
DataContext.Models.Add(entity);
DataContext.SaveChanges();

我觉得它有点干净。

您可以在您的模型中使用类似的东西。然后从您的控制器发送null将正常工作

 [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date")]
        public DateTime? Date { get; set; }

注意日期时间日期之前的“?”

您使用的是哪个数据库?SQL Server?当你说“给你一个错误”时,你会收到什么错误?您是使用DB first还是code first?insert的代码在哪里?使用Nullable还是DateTime?应该使其接受NULL。数据库中的列是否标记为“NOT NULL”?在数据库中,该字段被标记为NULL。问题是,如果datetime为NULL,并且sql server没有00/00/0001作为日期,则entity framework生成的datetime值为00/00/0001。我需要停止实体生成该默认值。在执行
SaveChanges()
时检查生成的sql并将其发布到此处。我注意到“?”在日期时间之后,但不是之前?
var entity= new Model
{
    GoDate = (DateTime?) null
}
DataContext.Models.Add(entity);
DataContext.SaveChanges();
 [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date")]
        public DateTime? Date { get; set; }