0

我正在開發一個asp.net mvc 5 web項目,並且我創建了一個Repository Model類來與我的數據庫進行交互,並且從我的操作方法。例如我的帖子編輯操作方法裏面我有下面的代碼: -從我的Controller操作方法傳遞對象到我的Repository方法

Repository repository = new Repository(); 
[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(SecurityRole Role) 
     { 

      try 
      { 
       if (ModelState.IsValid) 
       { 

        repository.InsertOrUpdateRole(Role); 

        repository.Save(); 


        return RedirectToAction("Index"); 
       } 
      }} 

這裏是倉庫模型CLAS: -

public class Repository 
{ 
private TEntities tms = new TEntities(); 
public void InsertOrUpdateRole(SecurityRole role) 
     { 
      role.Name = role.Name.Trim(); 
      if (role.SecurityRoleID == default(int)) 
      { 
       // New entity 
       //Code goes here 
      else 
      { 

t.Entry(role).State = EntityState.Modified; 

      } 
     } 

所以我的問題是,當我從我的行動傳遞對象方法到我的倉庫,實體框架將如何處理對象;它會在存儲庫中創建另一個副本,還是會跟蹤同一個對象?如果實體框架將在動作方法內部和會話中的存儲庫方法內部處理同一對象,那麼實體框架如何跟蹤對象?

第二個問題,最好的方法是什麼;通過從操作方法到倉庫的整個對象(如我目前做的),或而不是隻通過對象ID,並再次檢索庫模型的東西如下里面的對象: -

repository.InsertOrUpdateRole(Role.RoleID); 

和存儲庫裏面

public void InsertOrUpdateRole(int id) 
{ 
var SecurityRole = t.SecurityRoles.SingleOrDefault(a => a.SecurityRoleID == role.SecurityRoleID); 
} 

回答

2

在C#中的對象通過引用傳遞。當您在您的ActionResult中保存新的role時,您會注意到InsertOrUpdateRole呼叫後收到Id。只要有一些東西附加到上下文,EF就開始跟蹤更改。所以你的第一種方法工作正常(我也使用它)。確保將模型傳遞給InsertOrUpdateRole函數並設置了它的所有值,EF將覆蓋整個記錄,因此如果在視圖中忘記了某個屬性,它將成爲數據庫中的空值。如果您只想更新模型的一些屬性,請使用第二種方法。

+0

所以在這種情況下,角色對象在從存儲庫或操作方法訪問時是相同的?它是否正確 ? – 2014-10-28 13:43:48

+1

如果您將角色對象從操作方法傳遞到存儲庫,則確實如此。 – Marthijn 2014-10-28 14:09:58

+0

因此,如果我修改存儲庫中的角色屬性之一,我可以使用它insdie操作方法? – 2014-10-28 14:37:17

相關問題