2010-10-04 49 views
1

好吧,我一直在爲此掙扎了一段時間。在ASP.NET MVC 2數據對象中的常用數據屬性

我有一個標準的MVC2項目,並使用EF4來訪問數據對象。我的許多數據對象(以及數據庫表)有兩個公共字段:UpdateUserAccountID和UpdateDate。

在我的每個控制器的,我目前設置此字段中手動的編輯操作的每個控制器中:

// POST: /Modes/Edit/2 
    [HttpPost] 
    public ActionResult Edit(int id, FormCollection formValues) 
    { 
     Mode mode = _repository.GetMode(id); 

     //Set update flags 
     mode.UpdateUserAccountID = _userRepository.GetUserID(User.Identity.Name); 
     mode.UpdateDate = DateTime.Now; 

     try 
     { 
      UpdateModel(mode); 
      _repository.Save(); 
      return RedirectToAction("Details", new { id = mode.ModeID }); 
     } 
     catch 
     { 
      return View(mode); 
     } 

    } 

問題是,我想在一箇中心位置更新這兩個領域,無論控制器的類型。我爲我的數據對象使用Repository/IRepository模式。我還設置了一個BaseController,因爲我可以將上面例子中的'mode'對象傳遞給基本控制器中的通用函數來設置這兩個字段。但是,我無法弄清楚,通用功能沒有意識到這些特定的領域。

應該爲我的存儲庫創建一個基類嗎?我無法想象如何在MVC框架內工作。在webforms中,我只是有一個接口,我所有的模型都使用通用字段實現,但我似乎無法將其應用於MVC方法。

任何幫助,採取的方法將是偉大的。

回答

1

此帖包含了此方案的詳細解決方案: Entity Framework - Auditing Activity

基本上,這個想法是如何他們保存在之前的所有實體更新公共屬性,如LastModifiedByLastModifiedDate數據存儲在EF數據訪問層,具有一個公共代碼。

你應該擺脫2行代碼,你設置更新標誌的,讓所有發生在 Context_SavingChanges()就像它在上面的鏈接中描述的方式。既然你在一個網絡的情況下,你必須通過User.Identity.Name回到你Repository.Save()方法,然後調用Repository.GetUserID()在 Context_SavingChanges()爲好。

這樣,每次插入或更新實體到數據存儲時,都不需要更新這兩個屬性。它會在保存之前自動發生在一個地方。

+0

此解決方案完美運作。非常感謝! – Thomas 2010-10-04 16:04:28

+0

非常歡迎,我很高興它幫助:) – 2010-10-04 16:12:14