我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。
保存时,返回一个错误:
将datetime2数据类型转换为datetime数据类型会导致值超出范围
它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。
date列设置为DateTime,如下所示:
新数据专栏(“myDate, Type.GetType”)
问题
是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?
当前回答
我遇到了这个问题,并将以下内容添加到我的datetime属性中:
[Column(TypeName = "datetime2")]
public DateTime? NullableDateTimePropUtc { get; set; }
其他回答
实体框架4使用datetime2数据类型,因此在数据库中对应的字段必须是datetime2的SQL Server 2008。
要解决这个问题,有两种方法。
要在实体框架4中使用datetime数据类型,你必须将edmx文件中的ProviderManifestToken切换为“2005”。 如果你设置相应的字段为允许空(它转换为NULLABLE),那么EF自动使用日期对象作为datetime。
这个人快把我逼疯了。我想避免使用可空的日期时间(DateTime?)。我也没有选择使用SQL Server 2008的datetime2类型
modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
我最终选择了以下内容:
public class MyDb : DbContext
{
public override int SaveChanges()
{
UpdateDates();
return base.SaveChanges();
}
private void UpdateDates()
{
foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
{
var values = change.CurrentValues;
foreach (var name in values.PropertyNames)
{
var value = values[name];
if (value is DateTime)
{
var date = (DateTime)value;
if (date < SqlDateTime.MinValue.Value)
{
values[name] = SqlDateTime.MinValue.Value;
}
else if (date > SqlDateTime.MaxValue.Value)
{
values[name] = SqlDateTime.MaxValue.Value;
}
}
}
}
}
}
在我的SQL Server 2008数据库中,我有一个标记为不可空的DateTime列,但有一个GetDate()函数作为其默认值。当使用EF4插入新对象时,我得到了这个错误,因为我没有显式地在对象上传递DateTime属性。我期望SQL函数为我处理日期,但它没有。我的解决方案是从代码中发送日期值,而不是依赖数据库来生成它。
obj.DateProperty = DateTime.now; // C#
检查DB中的req格式。例如我的DB有默认值或Binding (((1)/(1))/(1900))
System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);
Code First上下文:
从这里开始
public DateTime Created { get; set; }
这个。添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime Created { get; set; }
在你的模型中。
一定要把这个也加到最上面
using System.ComponentModel.DataAnnotations.Schema;