3 votes

Puis-je exécuter une commande SQL sur une connexion DBContext avant que la première entité EF ne soit chargée ?

Je suis assez novice en matière d'EF et j'ai cherché une réponse à cette question sans succès.

En fait, lorsque j'obtiens une connexion à la base de données dans EF, je dois exécuter une procédure stockée pour mettre en place une sécurité interne, qui limitera ensuite les données qui sont ramenées dans les interactions EF.

En cherchant un peu, j'ai trouvé des informations qui disent que ce qui suit devrait fonctionner :

String currentUser = "Name";
_db = new DBContext();
if (_db.Database.Connection.State != ConnectionState.Open) {
    _db.Database.Connection.Open();
}

DbConnection conn = _db.Database.Connection;
DbCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "storedproc";

DbParameter user = cmd.CreateParameter();
user.DbType = DbType.String;
user.Direction = ParameterDirection.Input;
user.Value = currentUser.ToUpper();
cmd.Parameters.Add(user);
cmd.ExecuteNonQuery();

var customer = (from c in _db.Customer where c.ACCOUNT == inputAccount select c);           
response = customer.First<Customer>();

Cependant, lorsque j'essaie cela, j'obtiens le message "EntityConnection can only be constructed with a closed DBConnection" lorsque j'exécute la requête LINQ.

Quelqu'un sait-il si cela est possible ?

J'utilise EF4.1, et Oracle ODP.NET Beta pour mon accès à la base de données, qui se connecte à un serveur 10.2.0.3.0.

Merci d'avance pour toute aide !

[EDIT]

J'ai réussi à résoudre ce problème grâce à ce que Craig a mentionné et en faisant ce qui suit :

  • Fournir une connexion au DbContext
  • Ouverture de la connexion avant tout travail

Cela m'a permis d'exécuter mon processus de sécurité stocké, et a également forcé EF à garder la connexion ouverte afin que ma configuration de sécurité soit toujours valide.

Code comme suit :

OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["DBConnect"].ConnectionString);
_db = new DBContext(conn);
_db.UnderlyingContext().Connection.Open();
_db.UnderlyingContext().ExecuteStoreCommand("execute storedproc");
_db.SaveChanges();
var customer = (from c in _db.Customer where c.ACCOUNT == inputAccount select c);
response = customer.First<Customer>();

9voto

Craig Stuntz Points 95965

Ne passez pas à la connexion comme ça. Utiliser ObjectContext.ExecuteStoreCommand .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X