2010-04-06 11 views
7

Ich möchte nicht für meine aktuelle ModifeidDateTime sein, Maschinenzeit bereits Serverzeit. Jedes Mal, wenn ich eine Person in meiner Datenbank auf SQL Server 2008 aktualisieren oder hinzufügen möchte, möchte ich das Feld "ModifiedDateTime" ausfüllen. Es ist nicht so, dass ich die Aktualisierungsabfrage wie beim Datenadapterbefehl ändern kann, wenn ich mit dem Dataset arbeite und für mein ModifiedDateTime-Feld definiere, dass es = GetDate() ist. Ich habe eine gespeicherte Funktion erstellt, um einen Wert der GetDate() -Methode zu retutn, aber ich habe ein Problem, eine Prozedur zu importieren, die Werte als int, string ... oder gar keinen Wert zurückgibt, schon Entity-Werte als Person in meinem Fall . Warum das? Wie auch immer, es wäre eine große Hilfe, wenn Sie mir eine Lösung zur Verfügung stellen können, die den DateTime-Wert vom Server abruft.Wie kann man den Datenbankserver mit Entity Framework nach aktueller Datetime fragen?

+0

Welche Version von .NET und Visual Studio verwenden Sie? – bryanjonker

Antwort

13

Gibt es einen Grund, warum Sie es nicht einfach in Ihre Datenbank übertragen können? Wenn Sie DateTime.Now in Ihre Entitätsabfrage einschließen, wird es auf die Datenbank heruntergedrückt (getdate).

Beispiel Linq zu Entitäten

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

SQL generiert ..

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

könnte eine bessere Art und Weise, es zu tun?

+1

Das funktioniert gut. Ich habe über diese kanonischen Funktionen von datetime erfahren, aber ich wusste nicht, wie man sie aus dem Code dahinter benutzt. Ich habe gesehen, dass sie in CSDL verwendet werden können. Vielen Dank. – Levelbit

+0

Update: nicht mehr direkten Zugriff auf CreateQuery-Methode haben - müssen Sie zuerst - wie folgt: var query = ((IObjectContextAdapter) dbContext) .ObjectContext.CreateQuery ("CurrentDateTime()"); –

0

Wenn Sie in VS 2008 eine Funktionsvorlage zum Zurückgeben eines Skalars hinzufügen, wird der Code nicht hinzugefügt, um die Verwendung zu vereinfachen. Sie müssen direkt auf die Funktionsvorlage zugreifen. Ich verwende die partielle Klasse, um die erforderlichen Methoden zur einfacheren Verwendung zu erstellen. Sie haben dies in VS2010 behoben.

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; 
    } 

Weitere Informationen: Function Imports in Entity Model with a non-Entity Return Type

5

Dies ist ein Update von @Nix Antwort auf EF4:

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