我随时都有一个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
答案 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; }