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

Entity framework 使用column=GetUtcDate()使实体框架生成SQL,entity-framework,Entity Framework,我们的应用程序在许多web服务器上运行。正如预期的那样,这些web服务器的时间会随着时间的推移而扭曲。数据库是一台单独的机器,有自己的时间。我们使用的是EF 5.0,它有一个表,需要在多个列中使用非常精确和一致的时间。我希望确保此表中的日期列始终使用数据库服务器时间 在SQL中,我只需将列设置为GetUtcDate()。简单地说,日期是在数据库服务器上计算和设置的,即done。但是如何在插入或更新时使用EF实现这一点?为了清楚起见,我需要EF生成的SQL将该列设置为函数GetUtcDate(),

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

在SQL中,我只需将列设置为GetUtcDate()。简单地说,日期是在数据库服务器上计算和设置的,即done。但是如何在插入或更新时使用EF实现这一点?为了清楚起见,我需要EF生成的SQL将该列设置为函数GetUtcDate(),以便该值来自数据库服务器。我不希望在web服务器上计算日期。我看到并考虑过的一些想法,以及它们不适合我的原因:

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

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

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

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

        var dq = context.Database.SqlQuery<DateTime>("select GETUTCDATE();");
        DateTime serverDate;
        foreach (var dt in dq) {
            serverDate = dt;
        }
var dq=context.Database.SqlQuery(“选择GETUTCDATE();”;
日期时间服务器日期;
foreach(dq中的var dt){
serverDate=dt;
}

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

通常机器每天至少与NTP服务器同步一次,因此它们的关闭时间不应超过一秒钟。你需要更高的精度吗?不确定这是否有用,但你看到了吗。斯蒂恩,理论上是的,每天几秒钟。事实上,我看到Windows服务器关闭了几十秒。是的,在这种情况下,准确性确实很重要。尼利斯,我很感激这个链接,但它确实不能满足我的需要。我们已经在世界各地充分发挥了作用。由于我们的服务器是基于云的(Azure),并且可以生活在世界上的任何地方,UTC是我们唯一可以交谈的时间。感谢您的想法。你的建议看起来很像我最初问题中的选项3。这种(双db调用)的低效率让我难以接受。你有多大信心,我想要的只是不可能与英孚目前的情况?我已经使用英孚18个月,没有看到的选择。它可能在那里。无论如何,我想知道为什么需要如此频繁地从服务器收集日期时间。我曾在“精确时间”/“时间关键型”环境中工作。我很好奇,当所有事务都具有相同的基础时,您是否担心首先进入数据库的毫秒数?“准确时间”到底是什么?为什么如此关键?服务器X在处理请求时在服务器Y上的毫秒延迟是多少?是什么让更新时刻如此特别?