6

当我保存对数据库的更改时,我遇到了以下异常:

Cannot insert the value NULL into column 'Registered', table
'EIT.Enterprise.KMS.dbo.LicenseEntry'; column does not allow nulls.
INSERT fails. The statement has been terminated.

相关的代码优先模型属性如下所示:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime         Registered          { get; private set; }

...这就是我感到困惑的原因:据我所知,通过提供注释[DatabaseGenerated(DatabaseGeneratedOption.Identity),我命令 Entity Framework 自动生成该字段(在这种情况下:仅在创建时一次。)

因此,我希望有一个不可为空的(必需)字段,而无法手动更改 EF 处理的字段。

我究竟做错了什么?


笔记:

  1. 我不想使用 Fluent-API,因为我想使用 POCO。
  2. 该属性defaultValueSql也不是一个选项,因为我需要依赖独立于该项目的数据库(例如 for GETDATE())。
  3. 我正在使用实体框架 6 alpha 3,代码优先。
4

4 回答 4

3

尝试这个:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime?            Registered          { get; private set; }

问号使属性可以为空

于 2013-06-11T15:42:24.250 回答
2

这种技术的行为就像一个readonly持久化到数据库中的字段。一旦设置了值,就不能(很容易)使用代码更改它。(当然,如果需要,您可以将 setter 更改为publicor internal。)

当您创建使用此代码的类的新实例时,Registered最初不会设置。第一次Registered请求 的值时,它会看到它没有被分配一个,然后默认为DateTime.NowDateTime.UTCNow如果需要,您可以将其更改为。

从数据库中获取一个或多个实体时,Entity Framework 将设置 的值Registered,包括private像这样的设置器。

private DateTime? registered;
[Required]
public DateTime Registered
{
    get
    {
        if (registered == null)
        {
            registered = DateTime.Now;
        }
        return registered.Value;
    }
    private set { registered = value; }
}
于 2014-04-01T19:23:52.060 回答
2

There is no default DateTime. Only a min value.

You could potentially just set the datetime on that entity before calling dbContext.SaveChanges.

See this for a solution.

于 2013-06-11T20:51:47.217 回答
0

我所做的是将 value 设置为可选和可为空的。我使用了 Data Annotation,但也可以在 Fluent Api 中使用 IsOptional:

        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime? UpdatedAt { get; set; }

然后我创建了另一个 Sql 迁移,将值更改为默认值:

    public partial class AlterTableUpdatedAtDefault : DbMigration
    {
        public override void Up()
        {
            Sql(@"ALTER TABLE dbo.[Table]
                  ADD CONSTRAINT DF_Table_UpdatedAt
                  DEFAULT getdate() FOR UpdatedAt");
        }

        public override void Down()
        {
            Sql(@"ALTER TABLE dbo.[Table]
                  drop CONSTRAINT DF_Table_UpdatedAt");
        }
    }
于 2019-04-12T05:40:05.997 回答