2010-04-06 10 views
7

No quiero que mi ModifeidDateTime actual sea tiempo de máquina ya desde el servidor. Cada vez que deseo actualizar o agregar una persona a mi base de datos en SQL Server 2008, deseo completar ModifiedDateTime archivado. No es como si pudiera cambiar la consulta de actualización como con el comando del adaptador de datos cuando trabajo con el conjunto de datos y para definir para mi ModifiedDateTime archivado para ser = GetDate(). Creé la función almacenada para volver a enviarme un valor del método GetDate(), pero tengo un problema para importar el procedimiento que devuelve valores como int, cadena ... o ningún valor en absoluto, ya solo valores de entidades como Person por ejemplo en mi caso . ¿Porqué es eso? De todos modos, sería de gran ayuda si puede proporcionarme cualquier solución que funcione para recuperar el valor de DateTime del servidor.¿Cómo preguntar al servidor de bases de datos por datetime actual usando entity framework?

+0

¿Qué versión de Studio .NET y Visual está usando? – bryanjonker

Respuesta

13

¿Hay alguna razón por la que no puede presionarlo para bajarlo a su base de datos? Si incluye DateTime.Now en la consulta de su entidad, lo empujará hacia abajo (getdate) a la base de datos.

Ejemplo LINQ a las entidades

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

SQL generado ..

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

podría ser una mejor manera de hacerlo?

+1

Esto funciona bien. Descubrí estas funciones canónicas de fecha y hora, pero no sabía cómo usarlas desde código subyacente. Vi que se pueden usar en CSDL. Gracias. – Levelbit

+0

Actualización: ya no tiene acceso directo al método CreateQuery, necesita lanzarlo primero, así: var query = ((IObjectContextAdapter) dbContext) .ObjectContext.CreateQuery ("CurrentDateTime()"); –

0

En VS 2008, si agrega una plantilla de función para devolver un escalar, no agrega el código para que sea fácil de usar. Necesita acceder directamente a la plantilla de funciones: utilizo la clase parcial para crear los métodos necesarios para facilitar su uso. Lo arreglaron en 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; 
    } 

Más información: Function Imports in Entity Model with a non-Entity Return Type

5

Ésta es una actualización de la respuesta a @Nix EF4:

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