Datetime2默认值,实体框架

本文关键字:框架 实体 默认值 Datetime2 | 更新日期: 2023-09-27 18:05:43

我有一个列类型为datetime2的表(它是datetime,但我看到EF与datetime2一起工作)。我已将其设置为非空,默认值为SYSDATETIME()。为了正常工作,我已经将映射到EF模型中这一列的属性设置为Computed。现在,当我没有在该属性中设置任何值时,我可以在表中看到正常记录,但是当我尝试从代码中设置值时,它会忽略它,并在所有情况下设置SYSDATETIME()

如何插入默认值,这是在数据库中设置当没有值是在模型中的属性和属性的值,如果它不是空的和设置?

编辑:这里是示例代码
.....
ActionsJournal actionsJournalEntry =
 TestFactory.CreateActionEntry(.....);
if (/* some condition */)
{
  actionsJournalEntry.CreatedDate = DateTime.Now.AddDay(30); // else it will be null
}
ent.ActionsJournals.AddObject(actionsJournalEntry);
ent.SaveChanges();
....

Datetime2默认值,实体框架

简短的回答:没有变通办法是不可能的。

您必须设置StoreGeneratedPattern.Computed并且始终在数据库中设置值,或者您必须设置StoreGeneratedPattern.None并且始终在应用程序中设置值。不同之处在于,如果您设置Computed,它永远不会在更新或插入语句中传递您的值,而None即使您不设置它也总是传递它=默认日期(1.1.0001)的结果,以及您认为EF使用DATETIME2的原因。

另一个问题是designer/EF中的设计缺陷,它不允许您为DateTime设置默认值。

处理:

在实体的自定义无参数构造函数中设置日期时间的默认值,并将StoreGeneratedPattern设置为None:

public partial class ActionsJournal 
{
    public class ActionsJournal() {
        CreatedDate = DateTime.Now.AddDay(30);
    }
}

现在您将始终使用默认值为您的CreatedDate,除非您的应用程序或从数据库加载用另一个值覆盖它