2012-02-13 34 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行進行註釋並且忽略他的代碼...它必須工作。