我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。

保存时,返回一个错误:

将datetime2数据类型转换为datetime数据类型会导致值超出范围

它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。

date列设置为DateTime,如下所示:

新数据专栏(“myDate, Type.GetType”)

问题

是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?


当前回答

这个人快把我逼疯了。我想避免使用可空的日期时间(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;
                    }
                }
            }
        }
    }
}

其他回答

我发现这篇文章试图弄清楚为什么我总是得到以下错误,这是由其他答案解释的。

将datetime2数据类型转换为datetime数据类型会导致值超出范围。

使用可空的DateTime对象。 公共DateTime ?PurchaseDate{获取;设置;}

如果你使用实体框架 将edmx文件中的nullable属性设置为True

Code First上下文:

从这里开始

    public DateTime Created { get; set; }

这个。添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性。

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime Created { get; set; }

在你的模型中。

一定要把这个也加到最上面

using System.ComponentModel.DataAnnotations.Schema;

如果我们不传递一个日期时间到日期时间字段,默认日期{1/1/0001 12:00:00 AM}将被传递。

但是这个日期与实体框架工作不兼容,所以它会抛出 将datetime2数据类型转换为datetime数据类型会导致值超出范围

只需要默认DateTime。如果您没有传递任何日期,那么现在进入日期字段。

movie.DateAdded = System.DateTime.Now

在模型类的属性上添加下面提到的属性。

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]

当我想用ASP编辑一个页面时,我看到了这个错误。净MVC。我没有问题,而创建,但更新数据库使我的DateCreated属性超出范围!

当您不希望您的DateTime属性为空,并不想检查它的值是否在sql DateTime范围(和@Html。HiddenFor没有帮助!),只需在相关类(控制器)中添加一个静态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");

    }
}