2013-04-06 44 views
1

這是一個MVC應用程序,其中實體框架代碼優先爲ORM和MEF作爲IoC。 如果我將DbContext標記爲PartCreationPolicy.Shared,則說明每次嘗試執行編輯時,容器中都存在對象。 但是如果我簡單地將DbContext標記爲PartCreationPolicy.NonShared,那麼會如何爲每個請求創建? 對此有沒有可怕的性能影響?MVC中的NonShared DbContext是一種不好的做法?

更新 這裏是保存代碼:

Provider IRepository<Provider>.Put(Provider item) 
     { 
      if (item.Id == Guid.Empty) 
      { 
       item.Id = Guid.NewGuid(); 
       this.Providers.Add(item); 
      } 
      else this.Entry<Provider>(item).State = EntityState.Modified; 
      return item; 
     } 

這是錯誤當共享

具有相同鍵的對象已經在ObjectStateManager存在。 ObjectStateManager無法使用相同的 鍵追蹤多個對象。

+0

我剛剛發佈了代碼和錯誤消息。 – Vahid 2013-04-06 14:46:33

+0

我認爲這個問題與'提供者'表中的多個對象有相同的關係 – 2013-04-06 14:46:48

+0

@BhushanFirake這是不可能的,Code First使用'[Key]'屬性將形成主鍵,而不會**允許重複。 – mattytommo 2013-04-06 14:48:08

回答

3

你一定要用PartCreationPolicy.NonShared。關於上下文生命週期管理的所有內容,無論是sql,實體框架還是NHibernate(會話),都會同意一件事情:上下文應該是短暫的。一個簡單的規則是:使用它爲一個工作單位,這意味着:創建一個上下文,做東西,調用SaveChanges一次,處置。這個規則大部分時間適用於我。

共享(或單例)上下文是命中性能的模式,因爲上下文會隨着時間的推移而變得臃腫。更改跟蹤器需要跟蹤越來越多的對象,關係修復會變得更慢。你會發現自己一次又一次刷新(重新加載)實體。

相關問題