C# 将datetime2数据类型转换为datetime数据类型导致值超出范围-未使用datetime2
将datetime2数据类型转换为datetime数据类型导致值超出范围 我的应用程序最近开始显示这个错误,这很奇怪,因为它工作得更早。在我的“Word”模型中,我没有更改任何与DateTime相关的内容。当我向我的项目中添加新模型时,这种情况就开始发生了 当我试图编辑数据时,会显示服务器错误。创建和删除工作正常 控制器: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 =
[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;}”。