【问题标题】:Entity Framework Cannot Save - Conversion Of Datetime2 To DateTime Failing实体框架无法保存 - Datetime2 到 DateTime 的转换失败
【发布时间】:2013-09-13 21:47:20
【问题描述】:

我遇到了一些 Entity Framework 实体无法保存数据的问题。我得到的错误是

The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value

我有一个名为“Notes”的表格。它有一个名为“NoteDateTime”的日期时间字段。这是用于创建表的 SQL 的 sn-p。如您所见,NoteDateTime 字段没有任何异常。

CREATE TABLE [db].[Notes](
    [NoteID] [int] IDENTITY(1,1) NOT NULL,
    [NoteText] [varchar](8000) NULL,
    [NoteDateTime] [datetime] NULL,
    [IsReviewRequired] [bit] NULL,
    [ConvertToGlobal] [bit] NULL,
    [EmployeeID] [int] NULL,
    [EvaluationID] [int] NULL,
    [CustomerID] [int] NULL,
    [EmailID] [int] NULL,
    [AddedWhenMerged] [bit] NULL,
CONSTRAINT [PK_Notes] PRIMARY KEY CLUSTERED 
(
    [NoteID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

在我的 C# 代码中,我填充了一个“Notes”实体并调用 SaveChanges() 方法。当我调用 SaveChanges() 时发生错误。

dbContext.Notes.Add(new Note
{
    EvaluationID = evaluationId,
    CustomerID   = customerId,
    EmployeeID   = employeeId,
    NoteDateTime = DateTime.Now,
    NoteText     = noteText,
});

dbContext.SaveChanges();

我已经阅读了几个 stackoverflow 线程,建议是确保使用正确的日期并且日期不应为空。日期不为空,并且肯定在可接受的最小/最大限制范围内。我还尝试将列的类型转换为数据库中的 datetime2 ,但这并没有解决问题。奇怪的是,这似乎是最近的问题。我能想到的唯一改变我们的环境是我们将项目迁移到使用 MVC 4。

如何解决此问题并正确保存我的 Note 实体?

【问题讨论】:

  • Notes 是否有任何包含非空日期时间的外键关系?当我上周遇到这个问题时,我认为 DateTime 是默认值(我的 ViewModel 没有正确分配)。看起来您将其设置为 DateTime.Now 所以这不太可能是问题。
  • Notes 表有几个外键,但我认为它们不会影响保存。

标签: c# asp.net sql asp.net-mvc entity-framework


【解决方案1】:

Julie Lerhman 在这里 (http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Entity-Framework-Tips-and-Tricks) 讨论了这个确切的问题,相信我,她是专家。

我自己,我会像这样在您的代码中使 [NoteDateTime] 可以为空

public DateTime? NoteDateTime { set; get; }

【讨论】:

  • 在 Julie 的视频中,她使用的是代码优先表。我正在使用数据库优先表。我无法像她那样覆盖 SaveChanges() 方法。此外,她的覆盖方法用于填充 DateTime 字段,以防在保存之前为空。就我而言,我将其设置为 DateTime.Now 然后保存实体。不幸的是,这个视频没有解决我的问题。奇怪的是,我将其更改为数据库中的可为空字段,然后再次尝试,保存到数据库中的值为空,即使我提供了有效值。
  • 是的,按照 Jaycee 的建议,拦截使用 SQL 配置文件发出的 SQL,以查看发送到数据库的内容。此外,尝试使用 MiniProfiler 或 Glimpse 等工具来查看 Entity Framework 究竟生成了什么。如果 NULL 被发送到数据库,那是错误的 - 你说数据库优先?尝试重新生成数据库模型。我尝试使用您的字段创建表格并成功保存日期。问题可能是在那些 EDMX 层的某个地方引起的,除非您在桌面上有触发器。
【解决方案2】:

正如你没有提到它,使用 Sql profiler 来查看正在发送到服务器的 SQL。尝试手动运行 sql,看看返回了什么错误。

【讨论】:

  • 一个空值被传递到数据库中,这解释了 datetime2 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多