Answers:
如果您在字段不接受NULL值时未将值分配给DateTime字段,则会发生这种情况。
这为我解决了!
.NET中的DATETIME
和都DATETIME2
映射到System.DateTime
-您实际上不能进行“转换”,因为它实际上是相同的.NET类型。
请参阅MSDN文档页面:http : //msdn.microsoft.com/zh-cn/library/bb675168.aspx
这两个的“ SqlDbType
” 有两个不同的值-您可以在DataColumn
定义中指定这些值吗?
但是:在SQL Server上,支持的日期范围完全不同。
DATETIME
支持1753/1/1到“永恒”(9999/12/31),同时DATETIME2
支持0001/1/1到永恒。
因此,您真正需要做的是检查日期中的年份-如果日期在1753年之前,则需要将其更改为1753年之后的日期,以便DATETIME
SQL Server中的列可以处理它。
渣
DtInit = new System.DateTime(1492, 10, 12),
失败。
在我的SQL Server 2008数据库中,我有一DateTime
列标记为不可为空,但其GetDate()
功能为默认值。使用EF4插入新对象时,出现此错误是因为我没有在对象上明确传递DateTime属性。我希望SQL函数能够为我处理日期,但事实并非如此。我的解决方案是从代码发送日期值,而不是依靠数据库来生成日期值。
obj.DateProperty = DateTime.now; // C#
Nullable<DateTime>
,并且在代码中我可以将此字段保留为真正的null(而不是01/01/0000)。令我惊讶的是,EF to SQL知道忽略INSERT上的此null并使用服务器(GetDate()
)上的日期...对我们来说,这甚至更可取,因为我们需要更好的服务器一致性,而不必担心之间的时钟差异。 Web服务器和sql服务器。
对我来说是因为约会时间是
01/01/0001 00:00:00
在这种情况下,您想以我的FirstYearRegistered代码为例为EF DateTime对象分配null。
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
这个让我发疯。我想避免使用可为空的日期时间(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;
}
}
}
}
}
}
[Column(TypeName = "datetime2")]
?
有时EF不知道这是在处理计算列或触发器。通过设计,这些操作将在插入后在EF之外设置一个值。
解决方法是Computed
在EF edmx
中为StoreGeneratedPattern
属性中的该列指定。
对我而言,是当该列具有插入当前日期和时间的触发器时,请参阅下文的第三部分。
解决步骤
在Visual Studio中,打开Model Browser
页面,Model
然后Entity Types
->然后
StoreGeneratedPattern
Computed
对于这种情况,其他答案是解决方法,对于该列,其目的是在创建记录时指定时间/日期,这是SQL执行触发器以添加正确时间的工作。如下面的SQL触发器:
DEFAULT (GETDATE()) FOR [DateCreated]
。
GETDATE()
了当时的字面意思。但是最近有评论说SYSDATETIME()
,我认为应该对任何DateTime2操作使用它。
我遇到了这个问题,并在datetime属性中添加了以下内容:
[Column(TypeName = "datetime2")]
public DateTime? NullableDateTimePropUtc { get; set; }
using System.ComponentModel.DataAnnotations.Schema;
是必需的
正如andyuk已经指出的那样,当将NULL值分配给不可为空的DateTime字段时,可能会发生这种情况。考虑将DateTime更改为DateTime吗?或Nullable < DateTime >。请记住,如果您使用的是Dependency Property,还应确保您的依赖项属性的类型也是可空的DateTime类型。
以下是不完整的DateTime到DateTime的真实示例?类型调整引起奇怪的行为
实体框架4使用datetime2数据类型,因此在db中,SQL Server 2008的相应字段必须为datetime2。
要获得解决方案,有两种方法。
基于@ 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.)
}
在模型类的属性上添加以下提到的属性。
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]
在我的情况下,我们将Date强制转换为Datetime,但出现此错误。 发生的情况是,Date的最低要求为01/01/0001,而Datetime的最低要求为1753
结合我们的数据收集错误,您会得到例外!
有时,它在开发机器上可以正常运行,而不能在服务器上运行。就我而言,我必须输入:
<globalization uiCulture="es" culture="es-CO" />
在web.config文件中。
机器(服务器)中的时区正确(在CO语言环境中),但Web应用程序不正确。此设置完成,并且再次正常运行。
当然,所有日期都很有价值。
:D
我知道这个问题,你们所有人也应该这样做:
https://zh.wikipedia.org/wiki/年_2038_problem
在SQL中,创建了一个新的字段类型来避免此问题(datetime2)。
此“日期”字段类型具有与DateTime .Net类相同的范围值。它会解决您所有的问题,所以我认为解决该问题的最佳方法是更改数据库列类型(不会影响您的表数据)。
请检查以下两个:1)该字段没有NULL值。例如:
public DateTime MyDate { get; set; }
替换为:
public DateTime MyDate { get; set; }=DateTime.Now;
2)再次新建数据库。例如:
db=new MyDb();
继承的datetime属性有问题
当不可为空的日期字段在插入/更新时值为null时,通常会显示此错误消息。原因之一可能是继承。
如果您的日期是从基类继承的,并且您没有进行映射,则EF不会读取其值。
有关更多信息:https : //weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-选择策略指南
当我想编辑页面usnig ASP.Net MVC时,我看到此错误。创建数据库时没有问题,但更新数据库使DateCreated属性超出范围!
如果您不希望DateTime
Property为Nullable,并且不想检查其值是否在sql DateTime范围内(并且@Html.HiddenFor
无济于事!),只需static DateTime
在相关类(Controller)内添加一个字段,并在GET正在运行,然后在POST完成工作时使用它:
public class PagesController : Controller
{
static DateTime dateTimeField;
UnitOfWork db = new UnitOfWork();
// GET:
public ActionResult Edit(int? id)
{
Page page = db.pageRepository.GetById(id);
dateTimeField = page.DateCreated;
return View(page);
}
// POST:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Page page)
{
page.DateCreated = dateTimeField;
db.pageRepository.Update(page);
db.Save();
return RedirectToAction("Index");
}
}
检查数据库中的请求格式。例如我的数据库具有默认值或绑定(((1)/(1))/(1900))
System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);