2

我们的应用程序在许多 Web 服务器上运行。正如预期的那样,这些 Web 服务器的时间可能会随着时间的推移而出现偏差。数据库是一台独立的机器,有自己的时间。我们正在使用 EF 5.0,并且有一个表需要在多列中非常精确和一致的时间。我想确保此表中的日期列始终使用数据库服务器时间。

在 SQL 中,我只需将该列设置为 GetUtcDate()。很简单,在数据库服务器上计算并设置日期,完成。但是如何在插入或更新时使用 EF 执行此操作?需要明确的是,我需要 EF 生成的 SQL 将列设置为函数 GetUtcDate(),以便该值来自数据库服务器。我不希望在 Web 服务器上计算日期。我看到并考虑过的一些想法以及为什么它们对我不起作用:

1)我可以在模式中的列上使用默认值。但是我有很多更新场景,我还需要一致的日期,而不仅仅是插入。2)我可以在数据库中使用触发器。但是我们目前的数据库中的逻辑为零(毕竟我们使用的是 ORM),如果可以避免的话,我不想设置这个先例。确定何时在数据库端更新这些列也很棘手。3)我可以手动获取数据库服务器时间(如下例中的单独查询),将列设置为该值,然后进行更新。但这是非常低效的,因为它需要额外调用数据库。在一个紧密的循环中,这是太多的开销。加上时间现在不太准确,因为我早了几毫秒,尽管它至少是一致的。

 CreateQuery<DateTime>("CurrentUtcDateTime()").Execute().First();

那么这样做的正确方法是什么?或者甚至有可能让 EF 在这里做正确的事情?

4

1 回答 1

0

这个问题真的是,我可以告诉 EF 从数据库/基础提供程序获取日期/时间吗?据我所知,这在 EF 语句中是不可能的。您应该在 Get DBTime T-SQL GetDate 选择首选日期选项之前使用简单的 SQL 语句

        var dq = context.Database.SqlQuery<DateTime>("select GETUTCDATE();");
        DateTime serverDate;
        foreach (var dt in dq) {
            serverDate = dt;
        }

现在在您的 EF linq 语句中使用 serverDate 。

于 2013-08-22T01:05:12.557 回答