如何修复将datetime2数据类型转换为datetime数据类型时导致值超出范围的问题

3

我正在尝试从另一个数据库插入数据,这段代码之前是可以正常工作的,但今天突然不行了。

以下是代码:

var itemMember = Db.Members.FirstOrDefault(p => p.Id == CurrentMember.Id);
var itemSelectedName = Db.Topics.FirstOrDefault(p => p.Id == TopicId);
var itemMap = Db.Reeves.FirstOrDefault(p=> p.Member.Id == CurrentMember.Id);
var itemReeve = Db.Reeves.FirstOrDefault(p => p.Member.Id == CurrentMember.Id);
var item = new Problem
      {
          Name = input.Name,
          Text = input.Info,
          Topic = itemSelectedName,
          WhoIs = itemMember,
          Province = itemMap.Province,
          District = itemMap.District,
          Town = itemMap.Town,
          Reeve=itemReeve,
          Created=DateTime.Now,
          Solved = false,
          Read=false
      };

Db.Problems.Add(item);
Db.SaveChanges();

代码中没有空值,但是会抛出以下错误:
将datetime2数据类型转换为datetime数据类型时,结果超出范围。
我该怎么办?
还有这个错误出现了:
System.Data.Entity.Infrastructure.DbUpdateException: 保存未公开其关系的外键属性的实体时发生错误。由于无法将单个实体识别为异常源,因此EntityEntries属性将返回null。通过在实体类型中公开外键属性,可以更轻松地处理保存期间的异常。
但是就像我说的,它直到今天都可以正常工作 :/
这是视图模型:
[Display(Name = "Başlık"), Required, StringLength(50)]
public string Name { get; set; }

[Display(Name = "Bilgi")]
[UIHint("TinyMCE")]
public string Info { get; set; }

[Required(ErrorMessage = "Gerekli Alan")]
[Display(Name = "Konu")]
[UIHint("DropDownList")]
[AdditionalMetadata("DataController", "Problem")]
[AdditionalMetadata("DataAction", "ProblemDrop")]
public int? TopicId { get; set; }

这里是模型

public class Problem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
    public short Sira { get; set; }
    public DateTime Created { get; set; }
    public virtual Topic Topic { get; set; }
    public virtual Member WhoIs { get; set; }
    public virtual Province Province { get; set; }
    public virtual Town Town { get; set; }
    public virtual District District { get; set; }
    public virtual Reeve Reeve { get; set; }
    public Boolean Solved { get; set; }
    public DateTime SolvedDate { get; set; }
    public virtual Member WhoSolved { get; set; }
    public Boolean Read { get; set; }
}

解决方案:日期为空可能是问题的原因吗?

你的模型中是否包含其他的 DateTime 属性? - user3559349
发布您的模型类会很有帮助。 - jjczopek
我已经更新了模型和视图模型@StephenMuecke - furkan
我已经更新了问题 @jjczopek - furkan
你的数据库字段SolvedDate是DATETIME类型,只支持1753年至9999年的日期。如果你不为SolvedDate设置一个值,那么默认值是1/1/0001,超出了范围。你可以将数据库字段改为DATETIME2类型,但看起来它应该是可空的。 - user3559349
4个回答

3
您没有为 SolvedDate 设置一个值,所以默认值 01\01\01 将被发送到数据库,这导致了错误。
如果您想要 SolvedDate 的值为 null,您应该将其定义为可空日期(DateTime?),因为 DateTime 是一个结构体,不能被设置为 null

0

在创建一个新的视图模型后,我遇到了相同的错误。我将视图模型中的DateTime字段更改为可为空的(DateTime?),这解决了我的问题。


欢迎来到StackOverflow!除了为自己的问题提供解决方案的说明之外,还要附上相关代码,以便帮助其他用户解决他们的问题。 - buczek

0

在 ASP.NET 中,当无法将字段设置为可空时,这个方法是有效的:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}

0

当您尝试将无效日期插入到数据库中的datetime字段时,会出现该错误。请检查Problem模型中的此字段:

public DateTime SolvedDate { get; set; }

这个应该被设置为null或者初始化为某个值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接