Je dois exécuter une procédure stockée SQL à chaque fois avant d'interroger mon objet ObjectContext. Ce que je veux accomplir est de mettre le CONTEXT_INFO
à une valeur qui sera utilisée plus tard avec la plupart de mes requêtes.Exécuter une procédure stockée SQL avant chaque requête générée par EntityFramework
Quelqu'un at-il fait cela? Est-ce possible?
[EDIT]
Actuellement, je suis atteinte en ouvrant la connexion et l'exécution de la procédure stockée dans mon constructeur ObjectContext comme ceci:
public partial class MyEntitiesContext
{
public MyEntitiesContext(int contextInfo) : this()
{
if (Connection.State != ConnectionState.Open)
{
Connection.Open(); // open connection if not already open
}
var connection = ((EntityConnection)Connection).StoreConnection;
using (var cmd = connection.CreateCommand())
{
// run stored procedure to set ContextInfo to contextInfo
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "[dbo].[SetContextInfo]";
cmd.Parameters.Add(new SqlParameter("@ci", _contextInfo));
cmd.ExecuteNonQuery();
}
// leave the connection open to reuse later
}
}
Puis dans mon test d'intégration:
[TestMethod]
public void TestMethod1()
{
using (var ctx = new MyEntitiesContext(1))
{
Assert.AreEqual(2, ctx.Roles.ToList().Count);
Assert.AreEqual(2, ctx.Users.ToList().Count);
}
}
Mais cela m'oblige à laisser la connexion ouverte - ceci est source d'erreurs car j'ai toujours besoin de CONTEXT _INFO, et un autre développeur peut facilement faire:
[TestMethod]
public void TestMethod2()
{
using (var ctx = new MyEntitiesContext(1))
{
// do something here
// ... more here :)
ctx.Connection.Close(); // then out of the blue comes Close();
// do something here
Assert.AreEqual(2, ctx.Roles.ToList().Count);
Assert.AreEqual(2, ctx.Users.ToList().Count); // this fails since the where
// clause will be:
// WHERE ColumnX = CAST(CAST(CONTEXT_INFO() AS BINARY(4)) AS INT)
// and CONTEXT_INFO is empty - there are no users with ColumnX set to 0
// while there are 2 users with it set to 1 so this test should pass
}
}
Les moyens ci-dessus que je peux écrire le code comme dans mon test et everthing est vert (youpi!) Mais mon collègue utilise le code de TestMethod2 quelque part dans son entreprise logique et il est tout f'd up - et personne ne sait où et pourquoi puisque tous les tests sont verts:/
[EDIT2]
This blog post ne répond certainement pas à ma question, mais résout effectivement mon problème. Peut-être aller avec NHibernate sera mieux adapté à mon but :)
+ 1 concept intéressant. – tster
merci - ce que je le veux pour est le filtrage des données de locataire dans une application multi-locataire. Je ne veux pas passer le TenantId à chaque procédure stockée à la place j'utilise des vues qui s'appuient sur CONTEXT_INFO donc je voudrais toujours définir CONTEXT_INFO avant d'interroger la base de données. Et encore j'aimerais utiliser EF. J'ai eu cette idée à partir d'un article de blog: http://blogs.imeta.co.uk/jyoung/archive/2010/03/22/845.aspx –