1

我已经为我的 MVC 3 项目实现了一个基本控制器,以允许从我的数据库上下文访问用户实体的通用方式:

public abstract class MyBaseController : Controller
{
    protected DBEntitiesContainer db;

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
        this.db = new DBEntitiesContainer();
    }

    public UserDetails GetActiveUserDetails()
    {
        UserDetails userDetails = GetObjects.GetActiveUserDetails(this.db);
        return userDetails;
    }
}

这很好用,我的所有控制器都可以访问this.db.MyEntity并可以通过调用来检索UserDetails对象this.GetActiveUserDetails()

但是,当我尝试对实体执行更新时出现问题:

public class UpdateController : MyBaseController
{
  public ActionResult Index()
  {
    UserDetails userDetails = this.GetActiveUserDetails();    
    userDetails.LastOnline = DateTime.Now;
    UpdateModel(userDetails);
    this.db.SaveChanges();
  }
}

任何想法为什么UserDetails可以轻松检索对象,但是当我在调用后检查我的数据库时SaveChanges(),没有任何更新?我假设我正在以两种不同的方式访问我的上下文,但我看不到我是怎样的......!

编辑:这是 GetObjects.GetActiveUserDetails() 方法

public static UserDetails GetActiveUserDetails(DBEntitiesContainer db)
{
  MembershipUser membershipUser = Membership.GetUser();    
  UserDetails userDetails;

  try
  {
    if (membershipUser != null)
    {
      userDetails = (from u in db.UserDetails
                     where (u.UserId == (System.Guid)membershipUser.ProviderUserKey)
                     select u).First();
    }
    else
    {
      return GetGuestAccount();
    }
  }
  catch
  {
    return GetGuestAccount();
  }

  return userDetails;
}

不是我知道的最干净的方法......

4

2 回答 2

1

UpdateModel 是 Controller 基类的辅助方法。它支持更新我们在 HttpPost 操作方法期间使用传入的表单参数传递它的对象的属性。

它使用 relfection 找出对象的属性名称(我们传递的模型对象),然后根据表单(客户端表单)提交的输入值自动将分配值转换给它们。

在您的情况下,当您使用更新模型时,它没有输入值找到关联的模型,并且它使模型默认值与数据库中的一样。

尝试评论 updatemodel 行并运行他的代码......它必须工作。

于 2012-03-23T17:02:44.497 回答
0

以这种方式设置数据访问不是一个好主意。一个原因是您应该在使用 db 上下文后处理它。这意味着使用您的方法,这会使数据库连接保持打开状态,直到发生垃圾收集,这可能是几分钟或几小时后。随着其他 Web 请求的到来,新的数据库连接被创建,并且这些连接也没有被处理掉......等等......等等......这是一个伪内存泄漏(不是真正的内存泄漏,因为它最终会被收集,但它意味着资源在需要后得到很好的利用)

于 2012-02-13T22:38:02.303 回答