这意味着,根据所读取的内容,我的datatable具有DateTime2类型,而我的数据库具有DateTime类型;这是错误的。将datetime2数据类型转换为datetime数据类型导致超出范围的值
日期列被设置为 DateTime,代码如下:
new DataColumn("myDate", Type.GetType("System.DateTime"))
问题:这个问题可以在代码中解决还是需要在数据库层面上进行更改?
这意味着,根据所读取的内容,我的datatable具有DateTime2类型,而我的数据库具有DateTime类型;这是错误的。将datetime2数据类型转换为datetime数据类型导致超出范围的值
new DataColumn("myDate", Type.GetType("System.DateTime"))
问题:以下是一个实际的例子,演示了从不完整的DateTime调整为DateTime?类型而引发的奇怪行为:
Entity Framework 4使用datetime2数据类型,因此在SQL Server 2008中对应的字段必须是datetime2。
要解决这个问题有两种方法。
Attribute = [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Reference = System.ComponentModel.DataAnnotations.Schema
最初我忘记添加这个属性。因此在我的数据库中,约束条件是这样创建的
ALTER TABLE [dbo].[TableName] ADD DEFAULT (getdate()) FOR [ColumnName]
我添加了这个属性并更新了我的数据库,然后它就变成了
ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_dbo.TableName_ColumnName] DEFAULT (getdate()) FOR [ColumnName]
我在一个简单的控制台应用程序项目中遇到了这个问题,我的快速解决方案是通过运行此方法将任何可能的datetime2日期转换为可空的datetime:
static DateTime? ParseDateTime2(DateTime? date)
{
if (date == null || date.ToString() == "1/1/0001 12:00:00 AM")
{
return null;
}
else
{
return date;
}
}
基于 @sky-dev 的实现创建了一个基类。这样可以轻松应用于多个上下文和实体。
public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class
{
public BaseDbContext(string connectionString)
: base(connectionString)
{
}
public override int SaveChanges()
{
UpdateDates();
return base.SaveChanges();
}
private void UpdateDates()
{
foreach (var change in ChangeTracker.Entries<TEntity>())
{
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;
}
}
}
}
}
}
使用方法:
public class MyContext: BaseDbContext<MyEntities>
{
/// <summary>
/// Initializes a new instance of the <see cref="MyContext"/> class.
/// </summary>
public MyContext()
: base("name=MyConnectionString")
{
}
/// <summary>
/// Initializes a new instance of the <see cref="MyContext"/> class.
/// </summary>
/// <param name="connectionString">The connection string.</param>
public MyContext(string connectionString)
: base(connectionString)
{
}
//DBcontext class body here (methods, overrides, etc.)
}
在我的情况下,当为可空日期时间列显式分配NULL值,然后尝试保存更改时,将弹出此错误。
检查数据库中的req格式。例如,我的数据库有默认值或绑定(((1)/(1))/(1900))
System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);
Adding this code to a class in ASP.NET worked fort me:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}
<globalization uiCulture="es" culture="es-CO" />
继承的日期属性出现问题
当非空日期字段在插入/更新时具有null值时,通常会显示此错误消息。一个原因可能是继承。
如果您的日期是从基类继承而来的,并且您没有进行映射,则EF将无法读取其值。