【问题标题】:ASP MVC 3 Base controller for entity context access用于实体上下文访问的 ASP MVC 3 基本控制器
【发布时间】:2012-02-13 21:00:53
【问题描述】:

我已经为我的 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,并且可以通过调用this.GetActiveUserDetails()来检索UserDetails对象

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

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;
}

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

【问题讨论】:

  • 可以显示GetObjects.GetActiveUserDetails(this.db)的方法体吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 2013-11-06
      相关资源
      最近更新 更多