无法向字段 (DateTime) 插入空值。

3

尽管在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`,其中 `TimeStarted` 和 `LastHeard` 为 null。但是,当我尝试这样做时,会出现以下错误:
“无法将空值插入到列 'TimeStarted' 中,表 'dbo.ActiveItems';该列不允许为空。INSERT 失败。\r\n语句已终止。”
我似乎无法解决这个问题。
奇怪的是,我可以登录 SQL 服务器并在表中创建一个具有 null 值的行。这是因为 Entity Framework 出了问题吗?

是的,我指的是EDMX文件;=/ - Rubens Farias
我的系统表中似乎没有EDMX文件或__MigrationHistory表。 - gnychis
@StarPilot,例如,我没有字符串为空的问题。为什么DateTime需要不同/特殊的空值呢? - gnychis
3
你尝试过对数据库进行跟踪,查看实际执行的SQL语句,并验证它是否命中了正确的数据库吗? - CJBS
1
也许你正在操作错误的数据库等。但是为了以后的参考,请记住,如果你使用ADO.net通过SqlParameter保存[插入/更新]值,并且你需要将'NULL'保存到数据库中 - 你需要设置SqlParameter.Value = DbNull.Value。如果你将值设置为c# null,SqlParameter会失败。有趣的是,Oracle ODP.Net OracleParameter可以同时处理nullDbNull.Value - T.S.
显示剩余5条评论
1个回答

1
为确保连接到正确的数据库,使用Profiler进行SQL跟踪(执行SQL Trace)。如果约束违规与预期不一致(在模式方面),则很可能是连接到了不同的数据库。接下来,更新用于连接到Entity Framework的连接字符串以连接到正确的数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接