如何修复将datetime2数据类型转换为日期时间数据类型会导致超出范围的值

时间:2015-08-15 10:29:52

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

我正在尝试从另一个数据库插入数据,这段代码一直工作到今天。现在它已经不存在了。

以下是代码:

  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数据类型转换为日期时间数据类型会导致超出范围的值。

我该怎么办?

此错误现在也出现了:

  

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; }
}

解决:日期为空可能是问题吗?

4 个答案:

答案 0 :(得分:1)

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

如果您希望SolvedDate的值为null,则应将其定义为Nullable日期(DateTime?),因为DateTime是{{1}并且无法设置为struct

答案 1 :(得分:0)

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

public DateTime SolvedDate { get; set; }

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在ASP.NET中,当不能将字段设为可空时,这是可行的:

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