微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF +存储库ASP.NET MVC 3应用程序中的ObjectContext处理

如何解决EF +存储库ASP.NET MVC 3应用程序中的ObjectContext处理

| 因此,当我尝试通过
OnActionExecuting
ActionFilterattribute
中的存储库访问
ObjectContext
时,出现了
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
错误。 我的“ 3”检查HTTP cookie的存在。如果存在,它将与数据库一起验证,刷新其到期时间,然后将其添加
Controller
ViewData
集合中,以便
ActionResult
可以访问它。如果不存在,则会将用户重定向登录页面。 过滤器一半有效,因为当HTTP cookie确实存在并且尝试从数据库获取具体对象时,它会崩溃并显示上述错误消息。 由于到位的层数很多,我将继续将代码发布到
VerifyCookieAttribute.cs
CookieRepository.cs
Repository_1.cs
上。最后,尽管可能没有什么区别,但在
Repository_1.cs
SelectSingle
方法中会发生错误。 依赖注入由Ninject 2.2.1.0提供。当前启用了延迟加载,但是任一设置都会产生相同的错误。 无论如何,对于所有这些方面我都会出错的地方,我将不胜感激。在此先感谢您的帮助!
//  VerifyCookieAttribute.cs
[AttributeUsage(AttributeTargets.Class,AllowMultiple = false,Inherited = true)]
internal class VerifyCookieAttribute : ActionFilterattribute {
    [Inject]
    public CookieRepository Repository { private get; set; }

    private HttpRequestBase Request = null;
    private HttpResponseBase Response = null;

    private readonly bool Administration = false;
    private readonly bool Customers = false;

    private readonly string[] Excludedpaths = new string[2] {
        \"/Administration\",\"/Customers\"
    };

    public VerifyCookieAttribute(
        bool Administration,bool Customers) {
    this.Administration = Administration;
    this.Customers = Customers;
}

    public override void OnActionExecuting(
        ActionExecutingContext ActionExecutingContext) {
        this.Request = ActionExecutingContext.HttpContext.Request;

        if (!this.Excludedpaths.Contains(this.Request.Url.AbsolutePath)) {
            this.Response = ActionExecutingContext.HttpContext.Response;

            if (this.Exists()) {
                Cookie Cookie = this.Get();

                this.Refresh(Cookie);

                ActionExecutingContext.Controller.ViewData.Add(\"Cookie\",Cookie);

                if (this.Administration) {
                    ActionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {
                        area = \"Administration\",controller = \"Administration\",action = \"Dashboard\"
                    }));
                } else if (this.Customers) {
                    //  Do nothing
                };
            } else if (!this.Exists() && !this.Response.IsRequestBeingRedirected) {
                if (this.Administration) {
                    ActionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {
                        area = \"Administration\",action = \"Default\"
                    }));
                } else if (this.Customers) {
                    ActionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {
                        area = \"Customers\",controller = \"Customers\",action = \"Default\"
                    }));
                };
            };
        };
    }

    private bool Exists() {
        string Token = this.GetHttpCookietoken();

        return (!String.IsNullOrEmpty(Token) && (Token.Length == 256));
    }

    private Cookie Get() {
        string Token = this.GetHttpCookietoken();

        Cookie Cookie = this.Repository.SelectSingle(
            c =>
                (c.Token == Token));

        return (Cookie);
    }

    private string GetHttpCookietoken() {
        if (this.Request.Cookies[\"NWP\"] != null) {
            return this.Request.Cookies[\"NWP\"][\"Token\"];
        };

        return (string.Empty);
    }

    private void Refresh(
        Cookie Cookie) {
        if (Cookie.RefreshStamp <= DateTime.Now.AddHours(1)) {
            this.Repository.RefreshCookie(Cookie.CookieId);

            this.SetHttpCookie(Cookie);
        };
    }

    private void SetHttpCookie(
        Cookie Cookie) {
        this.Response.Cookies[\"NWP\"][\"Token\"] = Cookie.Token;
        this.Response.Cookies[\"NWP\"].Expires = Cookie.RefreshStamp.AddHours(1);
    }
}

//   CookieRepository.cs
public sealed class CookieRepository : Repository<Cookie> {
    [Inject]
    public CookieRepository(
        Entities Entities)
        : base(Entities,true) {
    }

    public void RefreshCookie(
        int CookieId) {
        this.Entities.ExecuteFunction(\"RefreshCookie\",new ObjectParameter(\"CookieId\",CookieId));
    }
}

//  Repository`1.cs
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {
    protected readonly Entities Entities = null;

    private readonly IObjectSet<TEntity> EntitySet = null;

    [Inject]
    public Repository(
        Entities Entities)
        : this(Entities,true) {
    }

    [Inject]
    public Repository(
        Entities Entities,bool CreateEntitySet) {
        this.Entities = Entities;

        if (CreateEntitySet) {
            this.EntitySet = this.Entities.CreateObjectSet<TEntity>();
        };
    }

    public virtual void Delete(
        TEntity TEntity) {
        this.EntitySet.DeleteObject(TEntity);
    }

    public virtual void Insert(
        TEntity TEntity) {
        this.EntitySet.Addobject(TEntity);
    }

    public virtual IQueryable<TEntity> Select() {
        return this.EntitySet;
    }

    public virtual IQueryable<TEntity> Select(
        Expression<Func<TEntity,bool>> Selector) {
        return this.EntitySet.Where(Selector);
    }

    public virtual bool SelectAny(
        Expression<Func<TEntity,bool>> Selector) {
        return this.EntitySet.Any(Selector);
    }

    public virtual IList<TEntity> SelectList() {
        return this.EntitySet.ToList();
    }

    public virtual IList<TEntity> SelectList(
        Expression<Func<TEntity,bool>> Selector) {
        return this.EntitySet.Where(Selector).ToList();
    }

    private IList<TEntity> SelectOrderedList(
        bool Ascending,params Expression<Func<TEntity,IComparable>>[] Orderers) {
        IOrderedQueryable<TEntity> Queryable = null;

        foreach (Expression<Func<TEntity,IComparable>> Orderer in Orderers) {
            if (Queryable == null) {
                Queryable = (Ascending ? this.EntitySet.OrderBy(Orderer) : this.EntitySet.OrderByDescending(Orderer));
            } else {
                Queryable = (Ascending ? Queryable.ThenBy(Orderer) : Queryable.ThenByDescending(Orderer));
            };
        };

        return (Queryable.ToList());
    }

    public virtual IList<TEntity> SelectOrderedList(
        params Expression<Func<TEntity,IComparable>>[] Orderers) {
        return this.SelectOrderedList(true,Orderers);
    }

    public virtual IList<TEntity> SelectOrderedDescendingList(
        params Expression<Func<TEntity,IComparable>>[] Orderers) {
        return this.SelectOrderedList(false,Orderers);
    }

    public virtual TEntity SelectSingle(
        Expression<Func<TEntity,bool>> Selector) {
        return this.EntitySet.Single(Selector);
    }

    public virtual void Update() {
        this.Entities.SaveChanges();
    }

    public virtual IEnumerable<TEntity> Where(
        Expression<Func<TEntity,bool>> Selector) {
        return this.EntitySet.Where(Selector);
    }
}
更新 这是每个@jfar请求的堆栈跟踪: M14ѭ1forMergeOption)+46    System.Data.Objects.ObjectQuery
1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +44
   System.Linq.Enumerable.Single(IEnumerable
1源)+184    System.Data.Objects.ELinq.ObjectQueryProvider.b_3(IEnumerable
1 sequence) +41
   System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable
1查询,表达式queryRoot)+59    System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(表达式)+150    System.Linq.Queryable.Single(IQueryable
1 source,Expression
1谓词)+300    C:\\ Projects中的{WITHHELD}.Repositories.Repository
1.SelectSingle(Expression
1选择器){WITHHELD} {WITHHELD} \\ Repositories \\Repository
1.cs:98
   VerifyCookieAttribute.Get() in C:\\Projects\\{WITHHELD}\\{WITHHELD}\\Attributes\\VerifyCookieAttribute.cs:100
   VerifyCookieAttribute.OnActionExecuting(ActionExecutingContext ActionExecutingContext) in C:\\Projects\\{WITHHELD}\\{WITHHELD}\\Attributes\\VerifyCookieAttribute.cs:55
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,ActionExecutingContext preContext,Func
1续)+47    System.Web.Mvc。<> c_displayClass17.b_14()+19    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func
1 continuation) +263
   System.Web.Mvc.<>c__displayClass17.<InvokeActionMethodWithFilters>b__14() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,Func
1延续)+263    System.Web.Mvc。<> c_displayClass17.b_14()+19    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func
1 continuation) +263
   System.Web.Mvc.<>c__displayClass17.<InvokeActionMethodWithFilters>b__14() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList
1过滤器,ActionDescriptor actionDescriptor,IDictionary
2 parameters) +191
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName) +343
   System.Web.Mvc.Controller.ExecuteCore() +116
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
   System.Web.Mvc.<>c__displayClassb.<BeginProcessRequest>b__5() +37
   System.Web.Mvc.Async.<>c__displayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__displayClass8
1.b_7(IAsyncResult)+12    System.Web.Mvc.Async.WrappedAsyncResult`1.End()+62    System.Web.Mvc。<> c_displayClasse.b_d()+50    System.Web.Mvc.SecurityUtil.b_0(动作f)+7    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(动作)+22    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+60    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)+9    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8862381    System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值并已完成同步)+184     

解决方法

我假设您正在使用mvc 3。   在早期版本的ASP.NET MVC中,   根据请求创建操作过滤器   除了少数情况。这种行为   从来都不是保证的行为,但是   只是实现细节,   过滤器的合同是   认为他们是无国籍的。在ASP.NET中   MVC 3,过滤器被更多地缓存   积极地。因此,任何习惯   动作过滤器存储不当   实例状态可能已损坏。 这意味着不会为每个请求都创建属性,因此任何“ 23”注入都将无效。您将需要注入
IServiceProvider
并在每次请求时获取包含该信息的存储库,或者手动创建新的上下文。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。