错误Db上下文已被处理

时间:2014-01-27 02:25:56

标签: c# asp.net-mvc repository-pattern

好的,所以我不知道发生了什么以及为什么我一直得到我的数据库上下文已被处理的错误。让我告诉你我有什么然后引导你完成它。

控制器:

[HttpPost]
public ActionResult UserProfile(UserProfileViewModel model)
{
    bool success = false;
    var user = UserRepository.GetUserById((int)Session["UserId"]);

    success = user.FriendId == null
        ? FriendRepository.CreateUserProfile((int) Session["UserId"], model)
        : FriendRepository.UpdateUserProfile((int) Session["UserId"], model);

    if (!success) return View("UserProfile");

    UpdateSession((int) Session["UserId"]);
    return RedirectToAction("AddSteamQuestion", "Steam");
}

private void UpdateSession(int id)
{
    var user = UserRepository.GetUserById((int)Session["UserId"]);
    Session["UserFirstName"] = user.Friend.Alias;

}

首先,它抓住了它成功完成的用户。然后它在我的仓库中插入或更新用户配置文件。这也似乎是成功的。最后,它需要更新会话中的用户名(以防它们更改它)。所以它跳转到Update会话方法,然后我得到抛出的错误?它不像GetUserId坏了我在我的应用程序中使用它。事实上,它成功地在UserProfile方法中的第一个var用户上提取了该数据。

错误说DbContext已被处理。

这是我为GetUserById做的疯狂巨大回购(它在var user =中断了):

public UserModel GetUserById(int sessionId)
        {
            try
            {
                using (db)
                {
                    var user = (from u in db.Users
                                join f in db.Friends on u.FriendId equals f.Id
                                where u.Id == sessionId
                                select new UserModel()
                                {
                                    CreatedOn = u.CreatedOn,
                                    EmailAddress = u.EmailAddress,
                                    FriendId = u.FriendId,
                                    Id = u.Id,
                                    RoleId = u.RoleId,
                                    Friend = new FriendModel
                                    {
                                        Alias = f.Alias,
                                        CarrierId = f.CarrierId,
                                        CreatedOn = f.CreatedOn,
                                        FirstName = f.FirstName,
                                        Id = f.Id,
                                        LastName = f.LastName,
                                        Locked = f.Locked,
                                        PhoneNumber = f.PhoneNumber,
                                        SteamId = f.SteamId
                                    }

                                }).SingleOrDefault();
                    return user;
                }
            }
            catch (SqlException e)
            {
                throw new InvalidOperationException("Cannot Get User By Id", e);
            }
        }

2 个答案:

答案 0 :(得分:1)

我假设您的db是dbContext的私有字段,已由垃圾收集器处理,因此当您尝试访问db.users时,您将看到错误。 我会这样写:

using (var db = new YourDataContext()) {
    ...// do work here
}

将其替换为:

using (db)

这将确保正确创建和处理您的DbContext。

答案 1 :(得分:1)

当您将对象放在using()语句中时,它会在退出块时“释放”该对象。这样对象就可以清理数据库连接等内容。一旦处置了对象,就不能再使用它了,你需要创建一个新对象。

看起来db是一个你正在创建并保留的变量 - 但是在using语句处理之后,它不能再次使用。修改代码,以便每次访问数据库时都创建新的数据上下文,如下所示:

using (DatabaseContext db = new DatabaseContext())
{
    ... // Do things here
}

每当使用using语句时,在语句中声明对象。对于数据库事务尤其如此,因为如果挂起到同一个上下文,可能会遇到并发和缓存的主要问题。保持您的上下文本地化,并在完成交易后立即处置它们。

相关问题