使实体框架使用column = GetUtcDate()生成SQL

时间:2013-08-22 00:19:59

标签: entity-framework

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

这个问题确实是,我可以告诉EF从DB /底层提供商那里获取日期/时间。据我所知,这不可能与EF声明没有。 您应该在Get DBTime之前使用简单的SQL语句 T-SQL GetDate选择首选日期选项

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

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