【问题标题】:How to ask the database server for current datetime using entity framework?如何使用实体框架向数据库服务器询问当前日期时间?
【发布时间】:2011-02-04 19:54:55
【问题描述】:

我有一个带有 ModifiedDateTime 属性的实体,我想用数据库中的当前日期时间而不是执行应用程序的“应用程序”服务器来更新它。

每次我想在 SQL Server 2008 上更新或添加一个人到我的数据库时,我都想填写 ModifiedDateTime 文件。当我使用数据集并将我的 ModifiedDateTime 文件定义为 GetDate() 时,我不能像使用数据适配器命令一样更改更新查询。我创建了存储函数来返回 GetDate() 方法的值,但是我在导入过程时遇到问题,该过程返回值作为 int、string 或根本没有值,在我的例子中已经只是实体值作为 Person。这是为什么?

无论如何,如果您能帮我从数据库服务器中检索当前的日期时间,那将是非常有帮助的。

【问题讨论】:

  • 您使用的是哪个版本的 .NET 和 Visual Studio?

标签: entity-framework entity-framework-6 entity-framework-4


【解决方案1】:

您是否有理由无法将其推送到您的数据库中?如果您在实体查询中包含 DateTime.Now,它会将其下推(getdate)到数据库。

到实体的示例 linq

 var dQuery = dbContext.CreateQuery<DateTime>("CurrentDateTime() ");
 DateTime dbDate = dQuery.AsEnumerable().First();

SQL 生成..

SELECT GetDate() AS [C1] FROM  ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]

可能是更好的方法吗?

【讨论】:

  • 这很好用。我发现了这个日期时间规范函数,但我不知道如何从后面的代码中使用它们。我看到它们可以在 CSDL 中使用。谢谢。
  • 更新:不再直接访问 CreateQuery 方法 - 需要先转换它 - 像这样: var query = ((IObjectContextAdapter)dbContext).ObjectContext.CreateQuery("CurrentDateTime() " );
【解决方案2】:

在 VS 2008 中,如果添加函数模板以返回标量,它不会添加代码以使其易于使用。您需要直接访问函数模板——我使用部分类来构建所需的方法以便于使用。他们在 VS2010 中修复了这个问题。

    public DateTime GetDateTime()
    {
        var returnValue = new DateTime();
        using (var connection = new EntityConnection(Connection.ConnectionString))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "myStoredProc";
                command.CommandType = CommandType.StoredProcedure;
                try
                {
                    returnValue = Convert.ToDateTime(command.ExecuteScalar());
                }
                finally
                {
                    connection.Close();
                }
            }
        }
        return returnValue;
    }

更多信息: Function Imports in Entity Model with a non-Entity Return Type

【讨论】:

    【解决方案3】:

    这是@Nix 对 EF4 的响应的更新:

    var dateQuery = dbContext.Database.SqlQuery<DateTime>("SELECT getdate()");
    DateTime serverDate = dateQuery.AsEnumerable().First();
    

    【讨论】:

      【解决方案4】:

      .net core 2.0 的更新

      var dual =  databaseContext
                  .Set<Dual>()
                  .FromSql("SELECT -1 AS Id, GETDATE() AS DateTime")
                  .First();
      

      假实体

      public class Dual
      {
          public int Id { get; set; }
          public DateTime DateTime { get; set; }
      }
      

      【讨论】:

        【解决方案5】:

        EF 3

        var dual = await db
                    .Set<Dual>()
                    .FromSqlRaw(@"
                        SELECT 
                            CURRENT_TRANSACTION_ID() as Id, 
                            SYSDATETIMEOFFSET() AS DateTime
                    ")
                    .FirstAsync();
        DateTimeOffset serverTime = dual.DateTime;
        
        public class Dual
        {
            public long Id { get; set; }
            public DateTimeOffset DateTime { get; set; }
        }
        
        modelBuilder.Entity<Dual>(entity =>
        {
            entity.HasNoKey();
            entity.ToView(nameof(Dual));
        });
        

        【讨论】:

        • 请注意,CURRENT_TRANSACTION_ID() 是仅在 SQL SERVER 2016+ 中可识别的函数名称。在旧版本中,您可以使用 @@SPIDCURRENT_REQUEST_ID()
        猜你喜欢
        • 2014-04-09
        • 1970-01-01
        • 2012-08-14
        • 2015-12-22
        • 1970-01-01
        • 2022-01-14
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多