C# 将datetime2数据类型转换为datetime数据类型导致值超出范围-未使用datetime2

C# 将datetime2数据类型转换为datetime数据类型导致值超出范围-未使用datetime2,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,将datetime2数据类型转换为datetime数据类型导致值超出范围 我的应用程序最近开始显示这个错误,这很奇怪,因为它工作得更早。在我的“Word”模型中,我没有更改任何与DateTime相关的内容。当我向我的项目中添加新模型时,这种情况就开始发生了 当我试图编辑数据时,会显示服务器错误。创建和删除工作正常 控制器: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include =

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

我的应用程序最近开始显示这个错误,这很奇怪,因为它工作得更早。在我的“Word”模型中,我没有更改任何与DateTime相关的内容。当我向我的项目中添加新模型时,这种情况就开始发生了

当我试图编辑数据时,会显示服务器错误。创建和删除工作正常

控制器:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ID,UsersLanguage,OtherLanguage,Notes")] Word word, int idOfCollection)
    {
        if (ModelState.IsValid)
        {
            db.Entry(word).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index", new { idOfCollection = idOfCollection });
        }
        return View(word);
    }
型号:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace WebLanguageTeacher.Models.MyDatabase
{
    public class Word
    {
        public int ID { get; set; }
        [MinLength(2, ErrorMessage = "Wydaje mi się, że słowo powinno mieć przynajmniej 2 litery ;)")] 
        [DisplayName("Język Użytkownika")]
        [Required]
        public string UsersLanguage { get; set; }
        [MinLength(2, ErrorMessage = "Wydaje mi się, że słowo powinno mieć przynajmniej 2 litery ;)")] 
        [DisplayName("Inny język")]
        [Required]
        public string OtherLanguage { get; set; }
        [DisplayName("Notatki")]
        public string Notes { get; set; }
        [DisplayName("Ostatnia powtórka")]
        public DateTime LastReviewed { get; set; }
        [DisplayName("Następna powtórka")]
        public DateTime NextReview { get; set; }
        [DefaultValue(0)]
        [DisplayName("Przerwa między powtórkami")]
        public int ReviewInterval { get; set; } /*W miejsce Difficulty*/

        [DisplayName("Nazwa właściciela")]
        public string OwnerName { get; set; }
        public virtual Collection Collection { get; set; }

        [NotMapped]
        public bool ModifyReview { get; set; } /* Klient przesyła tylko za ile dni będzie następna powtórka, serwer sam generuje datę*/

        public Word(){
            ModifyReview = false;
        }
    }
}
怎么了?我没有创建任何DateTime2变量,所以为什么我的应用程序尝试将DateTime2转换为DateTime

我使用ASP.net MVC和EntityFramework

  • 日期时间范围:1753年1月1日至9999年12月31日

  • 日期时间2范围:0001-01-01-9999-12-31

使用以下代码以避免冲突

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
  modelBuilder.Entity<Word>().Property(o => o.NextReview).HasColumnType("datetime2");
 }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Property(o=>o.NextReview).HasColumnType(“datetime2”);
}

使datetime为空您需要显式强制它们。如果属性“LastReview”可以为空,您应该像下面那样声明它

[DisplayName("Ostatnia powtórka")]
public DateTime? LastReviewed { get; set; }

与其他datetime变量相同,如果它们可为空

则datetime对象在其值未显式设置时默认为datetime.MinValue

因此,您的模型中有一个未设置的DateTime对象,并且默认为该对象,如上所述,该对象超出了DateTime dbtype的范围,因此EntityFramework将其转换为DateTime2 dbtype,这将导致数据库中的强制转换错误

要解决这个问题,请检查模型中的所有DateTime对象,并确保它们设置为DateTime.MinValue以外的任何对象。如果您不想将该值设置为任何值,那么在您的数据库和模型中将该字段设置为空,这样就可以了


注意,在db列上设置默认值并不能解决此问题,转换发生得太早,必须显式设置值

,如果不希望更改datetime字段(以及所有其他不希望修改的字段),则需要保留旧值。为此,从数据库中检索旧实体,只需更改编辑表单中更新的字段。例如:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,UsersLanguage,OtherLanguage,Notes")] Word word, int idOfCollection)
{
    if (ModelState.IsValid)
    {
        var dbWord = db.Words.Find(word.ID);
        dbWord.UsersLanguage = word.UsersLanguage;
        dbWord.OtherLanguage = word.OtherLanguage;
        dbWord.Notes = word.Notes;

        db.SaveChanges(); // in this case dbWord is saved so datetime fields remains intact
        return RedirectToAction("Index", new { idOfCollection = idOfCollection });
    }
    return View(word);
}

通过在DateTime之后添加问号使属性可为空

    public DateTime? SentOn { get; set; }

调用
SaveChanges()
之前,
lastReview
NextReview
的实际值可能重复?数据库中的某些日期时间字段可为空?@azhar\u SE\u nextbridge:否,这些文件都不可为空可能一个或多个
DateTime
值的值超出了SQL DateTime变量的范围(例如:如果其默认值为
DateTime.MinValue
)。尝试使用调试器单步执行并检查LastReview/NextReview的值。但我不想使其为空。我需要设置它,它是这里最重要的变量之一。默认情况下,如果你想给datetime对象赋值,它会给datetime对象赋值,如果你赋值,但它没有正确映射,这就是为什么会发生这个错误…为什么我要用这种奇怪的方式来做?我不能在创建变量时以某种方式声明它吗?类似于DBContext类中的“public DateTime2 lastReview{get;set;}”。