Ich schreibe eine Datenbankanwendung mit Visual Studio 2012 mit Entity Framework 5 und SQL Server 2008. Ich möchte, dass Entity Framework einen SQL Server-Benutzer imitiert (dh Benutzer ohne Anmeldung). Ich habe einen neuen Konstruktor für den DB-Kontext MyDatabaseEntities
erstellt, der ein Argument für den Namen des Benutzers enthält, der sich imitieren soll. Hier ist der Code, den ich geschrieben habe:Entity Framework 5 - Implementierung von SQL Server "Als Benutzer ausführen"
public partial class MyDatabaseEntities
{
private String _impersonateUser = null;
public MyDatabaseEntities(String impersonateUser)
: base("MyConnectionString")
{
_impersonateUser = impersonateUser;
this.Database.Connection.StateChange += Connection_StateChange;
}
void Connection_StateChange(object sender, StateChangeEventArgs e)
{
if (e.CurrentState == ConnectionState.Open && e.OriginalState != ConnectionState.Open)
{
using (var cmd = this.Database.Connection.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("user", _impersonateUser));
cmd.CommandText = "EXECUTE AS USER = @user";
cmd.ExecuteNonQuery();
}
}
}
Ich hatte die Kontrolle hinzufügen ...
if (e.CurrentState == ConnectionState.Open && e.OriginalState != ConnectionState.Open)
... weil die Methode Connection_StateChange
Methode auszuführen scheint, selbst wenn der Zustand hasn‘ t hat sich geändert. Dann Problem ist, dass, wenn ich den Code ausführen zweimal,
public void RunSimpleQuery()
{
using (MyDatabaseEntities context = new MyDatabaseEntities("UserName"))
{
var result = context.TableName.ToList();
}
}
... Entity Framework wirft ein SqlException
:
ein schwerwiegender Fehler auf dem aktuellen Befehl. Die Ergebnisse, falls any, sollten verworfen werden. \ R \ nEin schwerwiegender Fehler ist beim aktuellen -Befehl aufgetreten. Die Ergebnisse, falls vorhanden, sollten verworfen werden.
Irgendwelche Ideen?
aktualisieren 1
ich in meinem Code oben, ich geändert ...
cmd.CommandText = "EXECUTE AS USER = @user;";
... bis ...
cmd.CommandText = "REVERT; EXECUTE AS USER = @user;";
... und ich immer noch bekomme den gleichen SqlException
Fehler.
Das Problem ist, dass EF die Verbindung schließt, wenn sie es nicht benötigt, und es zurück in den Pool zurückgibt. Wenn es erneut SQL ausführt, fordert es eine neue Verbindung aus dem Pool an, in der Ihr Ereignis möglicherweise nicht initialisiert wird. –
@LadislavMrnka Ja, Sie haben das Problem identifiziert. Ich denke, dass ich in der Verbindungszeichenfolge angeben muss, um Verbindungspooling nicht zu verwenden ... es ist eine Schande. Bitte erstellen Sie eine Antwort dafür (sagen Sie einfach, was Sie in dem Kommentar gesagt haben), damit ich Ihnen den Kredit geben kann. Vielen Dank! – HydroPowerDeveloper
Sie sollten lieber versuchen, die Kontrolle über die Verbindung selbst zu übernehmen (indem Sie es an DbContext übergeben), aber es gab ein Problem damit: http://blogs.msdn.com/b/diego/archive/2012/01/26/exception -from-dbcontext-api-entityconnection-kann nur mit constructed-with-a-closed-dbconnection.aspx erstellt werden. –