EF7 DateTime"指定演员表无效"

时间:2016-03-24 02:30:49

标签: entity-framework asp.net-core

我随时都有一个ASP.NET核心项目,我已经添加了EF7。

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

然后每次重新启动项目后,我都尝试获取一个实体(通过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);
}

两个&#34;堆叠&#34;例外情况发生,第一个:

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

1 个答案:

答案 0 :(得分:0)

sql中的DateTime的最小值为1/1/1753 12:00:00 AM。由于您的TargetProperty不可为空,我认为您的实体正在使用&#39; 0001/01/01 12:00:00 AM&#39;这是clr中DateTime的最小值,它超出了范围,因此是您获得的异常。

您有两个选项可以解决您的问题,一个是更改迁移Up方法或映射,并将列数据类型设置为DateTime2。另一种方法是将TargetDate声明为可空。以下摘录。

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

public DateTime? TargetDate { get; set; }