Question

J'ai une entité avec une propriété ModifiedDateTime que je veux être mis à jour avec le datetime courant de la base de données au lieu du serveur « application » d'exécuter l'application.

Chaque fois que je veux mettre à jour ou ajouter une personne à mon datebase sur SQL Server 2008 Je veux remplir ModifiedDateTime déposé. Il est pas comme je peux changer la requête de mise à jour comme avec la commande de l'adaptateur de données lorsque je travaille avec ensemble de données et de définir pour mon ModifiedDateTime être déposé GetDate (). Je créé la fonction stockée pour me renvoyer une valeur de la méthode GetDate (), mais j'ai un problème d'importer la procédure qui renvoie des valeurs comme int, string ou pas de valeur du tout, déjà juste valeurs des entités comme personne, par exemple dans mon cas. Pourquoi donc?

Quoi qu'il en soit, il serait d'une grande aide si vous pouvez me aider à récupérer le DateTime en cours à partir du serveur de base de données.

Était-ce utile?

La solution

Y at-il une raison que vous ne pouvez pas pousser vers le bas à votre base de données? Si vous incluez DateTime.Now dans votre requête de l'entité, il poussera vers le bas (getdate) à la base de données.

Exemple LINQ to Entities

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

SQL généré ..

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

Peut-être une meilleure façon de le faire?

Autres conseils

Ceci est une mise à jour de la réponse @Nix à EF4:

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

Une mise à jour de base de .net 2.0

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

L'entité faux

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

Dans VS 2008, si vous ajoutez un modèle de fonction pour renvoyer un scalaire, il n'ajoute pas le code pour le rendre facile à utiliser. Vous devez accéder au modèle de fonction directement - j'utilise la classe partielle pour construire les méthodes nécessaires pour la facilité d'utilisation. Ils ont fixé cela dans 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;
    }

Plus d'informations: de fonction dans le modèle avec une entité non-entité type de retour

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top