MVC IRouteConstraint实体框架性能

时间:2012-10-01 14:52:26

标签: c# asp.net-mvc entity-framework-4 asp.net-mvc-routing

我正在努力使我的MVC应用程序尽可能高效。我刚刚遇到以下问题,我不确定是否可以在Entity Framework或MVC中解决。

我有以下路线:

            routes.MapRoute(
                "UserNameRoute",
                "{UserName}/{Action}",
                new { controller = "UserName", action = "Index" },
                new
                {
                    UserName = new UserConstraint(DependencyResolver.Current.GetService<IUserRepository>())
                });

然后是以下路线约束:

    private readonly IUserRepository repository;

    public UserConstraint(IUserRepository repository)
    {
        if (repository == null)
        {
            throw new ArgumentNullException("repository");
        }

        this.repository = repository;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (!values.ContainsKey(parameterName))
        {
            return false;
        }

        var siteRoot = (string)values[parameterName];

        var user = this.repository.Users.FirstOrDefault(u => u.UserName == userName && !u.Archived);

        if (user!= null)
        {
            values[parameterName] = user;
            return true;
        }

        return false;
    }
}

然后我对每个动作的所有控制器需求都是:

    public ActionResult ExampleAction(User userName)
    {
        return this.View(userName);
    }

这很有效我可以接受我的用户操作没有任何问题。当我在视图中放置一个动作链接时,问题就出现了:

@Html.ActionLink("View some action or other", "someaction", new { UserName = Model.UserName }, new { @class = "myclass" })

上面的这个动作链接将按原样路由我的IRouteConstraint,并在DB上执行另一个数据库选择以获得之前的相同用户。它将对页面上的每个操作链接执行此操作。有没有更有效的方法来执行此操作,因此数据库选择只执行一次?

我应该指出我首先使用EF代码。我没有使用通用存储库或我自己的滚动工作单元。我正在使用MVC的第4版和实体框架的v4.3。

0 个答案:

没有答案