用于实体上下文访问的ASP MVC 3 Base控制器

时间:2012-02-13 21:00:53

标签: asp.net-mvc controller entity savechanges updatemodel

我已经为我的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;
}

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

2 个答案:

答案 0 :(得分:1)

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

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

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

尝试对updatemodel行进行注释并对其进行编码...它必须正常工作。

答案 1 :(得分:0)

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