实体框架5 - 实现SQL Server"以用户身份执行"

Hyd*_*per 7 impersonation sql-server-2008-r2 entity-framework-5 visual-studio-2012

我正在使用带有Entity Framework 5和SQL Server 2008的Visual Studio 2012编写数据库应用程序.我希望Entity Framework能够模拟SQL Server用户(即没有登录的用户).我为DB上下文创建了一个新的构造函数,MyDatabaseEntities其中包含一个用于模拟的用户名的参数.这是我写的代码:

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

            }

        }

    }
Run Code Online (Sandbox Code Playgroud)

我不得不加上支票......

if (e.CurrentState == ConnectionState.Open && e.OriginalState != ConnectionState.Open)
Run Code Online (Sandbox Code Playgroud)

...因为Connection_StateChange即使状态没有改变,方法方法似乎也会执行.那么问题是,当我运行代码两次时,

public void RunSimpleQuery()
{
    using (MyDatabaseEntities context = new MyDatabaseEntities("UserName"))
    {
        var result = context.TableName.ToList();

    }

}
Run Code Online (Sandbox Code Playgroud)

......实体框架抛出SqlException:

当前命令发生严重错误.应丢弃结果(如果有).\ r \n当前命令发生严重错误.结果(如果有的话)应该被丢弃.

有任何想法吗?

更新1

我在上面的代码中,我改变了......

cmd.CommandText = "EXECUTE AS USER = @user;";
Run Code Online (Sandbox Code Playgroud)

...至...

cmd.CommandText = "REVERT; EXECUTE AS USER = @user;";
Run Code Online (Sandbox Code Playgroud)

......我仍然得到同样的SqlException错误.

Lad*_*nka 6

问题是EF在不需要连接时关闭连接并将其返回池中.因此,当它再次执行某些SQL时,它会从池中请求新连接,而您的事件可能无法初始化.但我再次相信您应该尝试通过手动控制连接生命周期来解决这个问题,以获得连接池的好处并且能够满足您的要求.