自动生成 EF 6 (Code first) 中的时间戳:将 datetime2 数据类型转换为 datetime 数据类型是一个超出范围的值。

3

我有一个继承自以下类的类:

 public abstract class BaseEntity 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }


    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime CreatedAt { get; set; }
}

但是,当我尝试持久化实例(在这里我没有设置CreatedAt)时,它会失败并显示错误:

{"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}

我做错了什么?

看看这篇博客文章是否能帮助您并对正在发生的事情进行良好的说明。http://www.mikesdotnetting.com/article/229/conversion-of-a-datetime2-data-type-to-a-datetime-data-type-resulted-in-an-out-of - Widunder
@AlinaVinnichek,你应该发布一个总结作为答案来获得贷款。这有助于我知道有很多方法可以解决它。 - AC4
2个回答

1
首先创建一个基本实体:
public class Student: BaseEntity
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public decimal Height { get; set; }
    public float Weight { get; set; }
}

public class BaseEntity{ 
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }    
}

然后在你的数据库上下文中覆盖 SaveChanges() 方法。

public override int SaveChanges()
{
    var entries = ChangeTracker
        .Entries()
        .Where(e => e.Entity is BaseEntity && (
                e.State == EntityState.Added
                || e.State == EntityState.Modified));

    foreach (var entityEntry in entries)
    {
        ((BaseEntity)entityEntry.Entity).UpdatedDate = DateTime.Now;

        if (entityEntry.State == EntityState.Added)
        {
            ((BaseEntity)entityEntry.Entity).CreatedDate = DateTime.Now;
        }
    }

    return base.SaveChanges();
}

就这样了。我从这里拿了个例子。更多细节可以在那里看到。


这是一个不错的解决方案! - Dante Souza e Souza

0

这是因为SQL具有不同的日期范围,只需添加此注释即可消除错误消息:

[Column(TypeName="datetime2")]

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