Asp.net mvc 4 会话中保留实体框架动态代理对象的风险?

Asp.net mvc 4 会话中保留实体框架动态代理对象的风险?,asp.net-mvc-4,entity-framework-5,session-state,Asp.net Mvc 4,Entity Framework 5,Session State,因此,我有一个相当全面的基于活动的访问控制系统,我使用实体框架为MVC4下的web应用程序构建。准确地说,访问控制并不关心是否使用EF,但应用程序是 无论如何,我现在正在加载每个请求的用户权限。我从IoC容器中获得了对DbContext的引用,该引用被注入到ApplicationController中,它会覆盖授权,以将用户的配置文件填充到HttpContext.Current.Items中。看起来效果不错,但我忍不住想知道这是不是最好的办法 我的想法是,由于用户的权限不会经常更改(如果有更改的

因此,我有一个相当全面的基于活动的访问控制系统,我使用实体框架为MVC4下的web应用程序构建。准确地说,访问控制并不关心是否使用EF,但应用程序是

无论如何,我现在正在加载每个请求的用户权限。我从IoC容器中获得了对DbContext的引用,该引用被注入到ApplicationController中,它会覆盖授权,以将用户的配置文件填充到HttpContext.Current.Items中。看起来效果不错,但我忍不住想知道这是不是最好的办法

我的想法是,由于用户的权限不会经常更改(如果有更改的话),因此更好的方法是将权限配置文件加载到会话中,然后在用户注销并重新登录之前根本不必更改它们(无论如何,在桌面操作系统中非常常见)。但我担心的是,如果我使用DbContext获取,那么我得到的对象是一个动态代理,它保存对DbContext的引用,我当然不想在整个会话中这样做

想法?这是一种很好的方法吗?如果是的话,我如何确保我的DbContext不会在我真正需要它的时候出现?

在查询之前,在
集合上调用
.AsNoTracking()
。实体仍将被代理,但将与
DbContext
分离

var userPermission = dbContext.Set<UserPermission>().AsNoTracking()
    .SingleOrDefault(x => x.UserName == User.Identity.Name);
想法?这是一个好方法吗

与此方法相关的另一个问题是,当您使用公共模式为每个http请求创建一个
dbContext
时。此模式通常在请求结束时处理
dbContext

protected virtual void Application_EndRequest(object sender, EventArgs e)
但是,当我们试图获取引用已处置的
DbContext
的代理实体的导航属性时,会发生什么情况呢


我们将得到一个
ObjectDisposedException

谢谢,这是一个非常全面的答案,我很感激;值得交换吗?如果我坚持目前的方法,将信息保存在HttpContext.Items中,并在每次请求时获取信息,我会得到更好的服务吗?。。。那么您是在MVC属性中进行访问控制?我想是的,因为你说你是在授权期间做的。。。这段代码是在控制器中还是在属性中?现在,我正在控制器基类中查找用户的配置文件,将其存储在HttpContext.Current.Items中,然后在自定义授权属性中取回它以执行实际检查。IMHO,如果您的配置文件有效,我现在将继续使用它。安全是你不应该试图弄乱的东西。获取每个请求的权限是安全的,即使它稍微慢一点。如果您确实想避免多次请求,可以尝试我在回答中提供的DTO解决方案。祝你好运。
protected virtual void Application_EndRequest(object sender, EventArgs e)