1

在从数据库中检索内容并通过控制器和视图对其进行可视化时,您如何以优雅而健壮的方式混合 ASP.NET MVC 和实体框架的概念?

下面的例子会抛出 Dispose 异常,因为在 using 语句关闭后会显示 View。

        // code in controller
        using (var usersDb = new UsersDb(new WebSecurityWrapper()))
        {
            var user = usersDb.GetUser(User.Identity.Name);
            return View(user);
        }

        // code in usersDb model -- GetUser method
        public User GetUser(string name)
        {
            var id = _webSecurity.GetUserId(name);
            var user = Users.FirstOrDefault(usr => usr.Id == id);

            return user;
        }

很明显,但我能想到的唯一选择是“克隆”用户对象,以便 View 可以独立显示它。这感觉不对。

那么这样做的适当方法是什么?

4

2 回答 2

1

我认为您正在视图中使用 User 对象的导航属性。这些可能是以一种懒惰的方式评估的。

User 对象是在您退出该方法之前创建的。不知何故,您正在请求在视图中查询的额外信息。但由于处置已经发生,这会导致异常。

一种选择是使用Include立即查询额外的必要数据。

于 2013-01-01T18:01:59.997 回答
0
    User user;
    using (var usersDb = new UsersDb(new WebSecurityWrapper()))
    {
        user = usersDb.GetUser(User.Identity.Name);
    }

    return View(user);
于 2013-01-01T16:39:42.830 回答