【问题标题】:Could not insert NULL value in to field (DateTime)无法在字段中插入 NULL 值(日期时间)
【发布时间】:2015-08-15 13:30:24
【问题描述】:

我正在努力解决这个问题,尽管在 SO 上有很多关于它的线程。

我有一个类有一个可以为空的DateTime? 字段,如下所示:

public class ActiveItem
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public Nullable<DateTime> TimeStarted { get; set; }
    public Nullable<DateTime> LastHeard { get; set; }
}

我有一个数据库架构定义为:

CREATE TABLE [dbo].[ActiveItems] (
    [ID]          INT      IDENTITY (1, 1) NOT NULL,
    [TimeStarted] DATETIME NULL,
    [LastHeard]   DATETIME NULL,
    CONSTRAINT [PK_ActiveWorkflows] PRIMARY KEY CLUSTERED ([ID] ASC)
);

然后我尝试保存ActiveItem,其中TimeStartedLastHeard 为空。但是,当我尝试这样做时,出现以下错误:

“无法将值 NULL 插入 'TimeStarted' 列,表 'dbo.ActiveItems';列不允许空值。INSERT 失败。\r\n语句已终止。”

我似乎无法解决这个问题。

奇怪的是,我可以登录到 SQL 服务器并在表中创建一个包含空值的行。这个实体框架是不是搞砸了?

【问题讨论】:

  • 映射保存在哪里和/或如何更新它?我没有意识到保留了某种映射。谷歌搜索.....
  • 是的,我的意思是一个 EDMX 文件; =/
  • 我的系统表中似乎没有 EDMX 文件或 __MigrationHistory
  • 您是否尝试过对数据库进行跟踪以查看正在执行的实际 SQL 是什么,并验证它是否访问了正确的数据库?
  • 可能是你打错了数据库等。但为了以后的参考,请记住,如果你使用 ADO.net 使用 SqlParameter 保存 [insert/update] 值,你需要将“NULL”保存到 DB - 您需要设置为SqlParameter .Value = DbNull.Value。如果您将值设置为c# null,SqlParameter 将失败。有趣的是,Oracle ODP.Net OracleParameter 可以同时做到 - nullDbNull.Value

标签: c# sql-server entity-framework datetime


【解决方案1】:

为确保您访问正确的数据库,do a SQL Trace 使用 Profiler。

如果违反约束与您所期望的(就架构而言)不一致,您可能会访问不同的数据库。

然后,将用于连接实体框架的连接字符串更新到正确的数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多