【问题标题】:datetime2 default value, entity frameworkdatetime2 默认值,实体框架
【发布时间】:2011-08-17 04:27:32
【问题描述】:

我有一个列类型为 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 值。
  • @Kak Ylia ...您需要代码示例或业务案例吗?以及它与问题的关系如何?
  • @NDeveloper,代码示例总是与 SO 上的问题相关。我也想看一些代码来演示这个问题。
  • @Inuyasha 问题现在包含示例代码...问题是它不关心 actionsJournalEntry.CreatedDate 中是否有任何值,它只是插入数据库默认值,即 SYSDATETIME()。
  • 你的映射怎么样?在SSDL 中,有两个不同的属性,StoreGeneratedPatternDefaultValue。如果StoreGeneratedPatternComputed,那么您的意思是数据库总是 设置/重置此值。

标签: c# .net entity-framework


【解决方案1】:

简短回答:没有解决方法是不可能的。

您必须设置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 将始终具有默认值,除非您的应用程序或从数据库加载将其覆盖为另一个值。

【讨论】:

  • 据我了解,值只能从数据库或应用程序中设置。数据库中不可能有默认值,并且可以选择用从应用程序传递的值覆盖它
  • 伙计……这太糟糕了,我的意思是,EF 4.1+ 很棒,但这是很常见的,不考虑它。
  • 所以微软说; “让我们创建一个名为 DateTime2 的新类型,它比它要替换的类型更糟糕”。为什么为什么为什么为什么为什么!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多