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>();