【问题标题】:How to fix The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value如何修复将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围
【发布时间】:2015-08-15 10:29:51
【问题描述】:

我正在尝试从另一个数据库插入数据,并且此代码一直有效。现在没有了。

代码如下:

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();

代码中没有null,它会抛出错误:

将 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 属性?
  • 发布你的模型类会很有帮助。
  • 我已经更新了模型和视图模型@StephenMuecke
  • 我已经更新了问题@jjczopek
  • SolvedDate 的数据库字段是 DATETIME,它仅支持 1753-9999 年的日期。如果您没有为SolvedDate 设置值,则默认为超出范围的1/1/0001。您可以将数据库字段更改为 DATETIME2 但看起来它确实应该可以为空

标签: c# asp.net-mvc-4 datetime


【解决方案1】:

您没有为SolvedDate 设置值,因此默认值01\01\01 将被发送到数据库,从而导致错误。

如果你想让SolvedDate 具有null 值,你应该将它定义为Nullable date(DateTime?),因为DateTime 是一个struct 并且不能设置为null

【讨论】:

    【解决方案2】:

    当您尝试将无效日期插入 DB 中的 datetime 字段时,会出现该错误。在Problem 模型中检查该字段:

    public DateTime SolvedDate { get; set; }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 欢迎来到 StackOverflow!除了提供对您有用的解释之外,还包括一些代码,以帮助未来的用户解决他们的问题。
      【解决方案4】:

      这在 ASP.NET 中有效,当使字段可以为空时不是一个选项:

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

      【讨论】:

        猜你喜欢
        • 2012-05-16
        • 2011-04-07
        • 2011-11-15
        • 2010-11-22
        相关资源
        最近更新 更多