【问题标题】:EF7 DateTime "Specified cast is not valid"EF7 DateTime“指定的演员表无效”
【发布时间】:2016-03-24 22:16:38
【问题描述】:

我有一个 ASP.NET Core 项目在路上,我已经添加了 EF7。

在 Amazon RDS 上使用 SQL Server 一切正常,除非我将 DateTime 字段添加到我的模型并将其迁移到数据库。

然后,每次我重新启动项目并尝试获取实体(通过 DBContext 和 Linq)后,我都会收到一条非常非常讨厌的异常消息。它不喜欢的 DateTime 值是什么?

模型类:

public class Advertiser
{
    // ... Standard constructors go here

    [Key]
    public string Key { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }
    public string Email { get; set; }
    public DateTime TargetDate { get; set; }
    public string Comments { get; set; }
}

上下文:

public class AdvertiserContext : DbContext
{
    public DbSet<Advertiser> Advertisers { get; set; }
}

Repository 类中导致异常的代码行:

public Advertiser Find(string key)
{ 
    return Context.Advertisers.Single(x => x.Key == key);
}

出现两个“堆叠”异常,第一个:

Microsoft.Data.Entity.Query.Internal.QueryCompiler[1]
An exception occurred in the database while iterating the results of a query.
System.InvalidCastException: Specified cast is not valid.
at (wrapper dynamic-method) System.Object:lambda_method (System.Runtime.CompilerServices.Closure,Microsoft.Data.Entity.Storage.ValueBuffer)

第二个:

Microsoft.AspNet.Server.Kestrel[13]
An unhandled exception was thrown by the application.
System.InvalidCastException: Specified cast is not valid.
at (wrapper dynamic-method) System.Object:lambda_method (System.Runtime.CompilerServices.Closure,Microsoft.Data.Entity.Storage.ValueBuffer

【问题讨论】:

  • 请包含您的相关型号/代码
  • 在添加新的日期字段之前您有现有数据吗?也许这些行的日期为空值,如果是这样,请尝试填充空行
  • 很好的猜测,但我使用示例数据进行了测试,并在测试之间将表放入数据库中。好像和新列的添加没有关系,一开始就没有空值。
  • “一个非常非常讨厌的异常消息” 我知道这显然很讨厌,但是在您的问题中提供该消息将大大有助于使这个问题得到回答。 .
  • 刚刚添加了例外。上面的亚历克斯把它们删掉了。显然太讨厌了……所以,妥协。我只是包括了相关部分。

标签: entity-framework asp.net-core


【解决方案1】:

sql 中的 DateTime 的最小值为 1/1/1753 12:00:00 AM。由于您的 TargetProperty 不可为空,我想您的实体正在使用 '0001/01/01 12:00:00 AM' 进行初始化,这是 clr 中 DateTime 的最小值,它超出了范围,因此您得到了异常.

您有两种选择来解决您的问题,一种是更改迁移 Up 方法或映射并将列数据类型设置为 DateTime2。另一种方法是将 TargetDate 声明为可为空。跟随sn-ps。

 modelBuilder.Entity<Advertiser>(entity =>
{    
    entity.Property(a => a.TargetDate)
                .ForSqlServerHasColumnType("DateTime2");
});

public DateTime? TargetDate { get; set; }

【讨论】:

  • 我觉得你在做某事,因为代码(和数据)在第一次运行时运行良好。然后当我停止并重新启动服务器时,异常开始,表明问题源于代码的重新初始化。添加 ? DateTime 类型的“运算符”确实会在数据库中产生一个可为空的字段,实际上,自动对应的数据类型是 DateTime2,我相信这就是您正在寻找的效果。不幸的是,这不会改变结果(同样的例外也会发生)。
  • 你是在 OSX 还是 Linux 上运行?
  • 我查看了这些错误,并且 4012 与我在那儿发布的足够相似,以便对此事提出一些额外的意见。感谢您的提醒,是的,我说我们几乎肯定会在这里查看框架错误。我会报告调查结果。
  • 4012 是 github.com/aspnet/EntityFramework/issues/2596 的副本。真正的问题是 Mono 的 SqlClient 实现是有缺陷的,并且多年来没有受到太多关注。
猜你喜欢
  • 2015-11-20
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多