2009-04-16 4 views
1

Je souhaite récupérer le numéro de séquence suivant via une requête ad hoc dans Entity Framework. J'utilise:Comment obtenir le numéro de séquence suivant dans DB2 en utilisant Entity Framework?

LogEntities db = new LogEntities(); 

ObjectQuery<Int64> seq = db.CreateQuery<Int64>("SELECT AUDITLOG.EVENTID_SEQ.NEXTVAL from sysibm.sysdummy1"); 

Cela renvoie l'erreur suivante:.

ErrorDescription = « « sysibm.sysdummy1 » n'a pas pu être résolus dans le cadre ou le contexte actuel Assurez-vous que toutes les variables sont référencées dans la portée, les schémas requis sont chargés et les espaces de noms sont référencés correctement. "

Je suppose que c'est parce que sysdummy1 n'est pas une table mappée dans mon modèle.

Quelqu'un sait-il comment je peux effectuer cette requête en utilisant le contexte LINQ 2 Entity?

Répondre

1

Merci pour votre réponse Craig. La raison pour laquelle je ne peux pas utiliser une colonne d'identité à incrémentation automatique est que cette table logique particulière est partitionnée physiquement en 31 tables distinctes (quotidiennes) et que l'ID doit être unique dans toutes les tables.

J'ai fini par créer une procédure stockée pour extraire le numéro suivant de la séquence, puis l'ajouter à mon magasin EF Model.

private static long GetNextEventId(DbConnection dbConnection) 
{ 
    using (DbCommand cmd = dbConnection.CreateCommand()) 
    { 
     cmd.CommandText = "LogEntities.GetNextEventId"; 
     cmd.CommandType = CommandType.StoredProcedure; 

     // Execute the command 
     return Convert.ToInt64(cmd.ExecuteScalar()); 
    } 
} 

Voici une autre façon d'appeler un proc stocké dans EF qui retourne un scalaire.

Using Stored Procedures That Return Non Entity Type

1

Une ObjectQuery doit utiliser l'Entity SQL et non le SQL "normal". Si vous voulez écrire du SQL "normal", vous devez utiliser une connexion de stockage, pas une ObjectQuery. Cela dit, je me demande pourquoi vous récupérez manuellement un numéro de séquence. Si la propriété d'entité est définie sur l'incrémentation automatique sur le serveur, elle sera récupérée automatiquement lorsque vous sauvegardez les modifications. Si vous devez obtenir une connexion de magasin, il existe une méthode sur le type EntityConnection, CreateDbCommand, qui le fait. Encore une fois, je recommande que vous ne le faites pas. L'utilisation de cette fonctionnalité rend votre code spécifique au fournisseur. La plupart du code Entity Framework doit être indépendant du fournisseur.

0

Une autre option serait de créer une table avec une colonne d'identité et d'utiliser la valeur de la fonction identité val après l'insertion.