当我保存对数据库的更改时,我遇到了以下异常:
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)
我命令实体框架自动生成字段(在这种情况下:创建时只有一次)时间。)
所以我希望有一个不可为空(必需)的字段,而不可能在EF处理的情况下手动改变字段。
我做错了什么?
注意:
defaultValueSql
也不是一个选项,因为我需要依赖此项目的数据库(例如GETDATE()
)。答案 0 :(得分:3)
试试这个:
[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime? Registered { get; private set; }
问号使属性可以为空
答案 1 :(得分:2)
此技术的行为类似于持久保存到数据库的readonly
字段。一旦设置了值,就不能(轻松)使用代码更改它。 (当然,如果需要,您可以将设置器更改为public
或internal
。)
当您创建使用此代码的类的新实例时,最初不会设置Registered
。第一次请求Registered
的值时,它会看到它尚未分配一个,然后默认为DateTime.Now
。如果需要,您可以将其更改为DateTime.UTCNow
。
从数据库中提取一个或多个实体时,实体框架将设置Registered
的值,包括private
这样的设置者。
private DateTime? registered;
[Required]
public DateTime Registered
{
get
{
if (registered == null)
{
registered = DateTime.Now;
}
return registered.Value;
}
private set { registered = value; }
}
答案 2 :(得分:1)
答案 3 :(得分:0)
我所做的是将值设置为可选且可为空。我使用了数据注释,但也可以在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");
}
}