Visual Studio 2012 と Entity Framework 5 および SQL Server 2008 を使用してデータベース アプリケーションを作成しています。Entity Framework で SQL Server ユーザー (つまり、ログインしていないユーザー) を偽装したいと考えています。MyDatabaseEntities
偽装するユーザーの名前の引数を含むDB コンテキストの新しいコンストラクターを作成しました。ここに私が書いたコードがあります:
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();
}
}
}
私はチェックを追加しなければなりませんでした...
if (e.CurrentState == ConnectionState.Open && e.OriginalState != ConnectionState.Open)
...Connection_StateChange
状態が変化していない場合でも、メソッド メソッドが実行されているように見えるためです。次に問題は、コードを2回実行すると、
public void RunSimpleQuery()
{
using (MyDatabaseEntities context = new MyDatabaseEntities("UserName"))
{
var result = context.TableName.ToList();
}
}
...Entity Framework は次をスローしSqlException
ます。
現在のコマンドで重大なエラーが発生しました。結果がある場合は破棄する必要があります。\r\n現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。
何か案は?
更新 1
上記のコードで、変更しました...
cmd.CommandText = "EXECUTE AS USER = @user;";
...に...
cmd.CommandText = "REVERT; EXECUTE AS USER = @user;";
...そして、まだ同じSqlException
エラーが発生します。