2012-02-13 43 views
1

我已经实现了一个基本的控制器为我的MVC 3的项目,允许从我的分贝范围内访问用户实体的一种常见方式:对实体上下文访问ASP 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; 
} 

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

+0

你可以显示'GetObjects.GetActiveUserDetails(this.db)'的方法体吗? – Eranga 2012-02-13 23:10:37

回答

0

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

1

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

它使用relfection来找出对象的属性名称(模型对象,我们通过),然后根据窗体(客户端窗体)提交的输入值自动将赋值赋值给它们。

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

尝试对updatemodel行进行注释并且忽略他的代码...它必须工作。