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();
....
简短的回答:没有变通办法是不可能的。
您必须设置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
,除非您的应用程序或从数据库加载用另一个值覆盖它