我有一个列类型为datetime2的表(它是datetime,但我看到的是与datetime2一起使用的EF)。
我将其设置为非null并且默认值为SYSDATETIME()
。为了正常工作,我设置了在EF模型中映射到此列的属性Computed
。现在,当我没有在该属性中设置任何值时,我可以在表中看到非正式记录,但是当我尝试从代码中设置值时,它会忽略它,并且在所有情况下都设置SYSDATETIME()
。
当模型中的属性中没有值时,如何插入在DB中设置的默认值,如果该属性的值不为null,则如何设置?
编辑:这是示例代码
.....
ActionsJournal actionsJournalEntry =
TestFactory.CreateActionEntry(.....);
if (/* some condition */)
{
actionsJournalEntry.CreatedDate = DateTime.Now.AddDay(30); // else it will be null
}
ent.ActionsJournals.AddObject(actionsJournalEntry);
ent.SaveChanges();
....
答案 0 :(得分:4)
简短回答:没有解决方法是不可能的。
您必须设置StoreGeneratedPattern.Computed
并始终在数据库中设置值,或者必须设置StoreGeneratedPattern.None
并始终在应用程序中设置值。不同之处在于,如果设置Computed
,它永远不会在更新或插入语句中传递您的值,而None
总是将它传递给它,即使您没有设置它=结果默认日期为1.1.0001并且您认为EF使用DATETIME2
。
另一个问题是设计师/ EF中的设计缺陷,它不允许您为DateTime
设置默认值。
解决方法:
在实体的自定义参数较少构造函数中设置日期时间的默认值,并将StoreGeneratedPattern
设置为None
:
public partial class ActionsJournal
{
public class ActionsJournal() {
CreatedDate = DateTime.Now.AddDay(30);
}
}
现在,除非您的应用程序或从数据库加载,否则您的CreatedDate
将始终具有默认值。