2011-11-21 33 views
0

我已經搜索了一段時間的「行未找到或更改」錯誤,我只是無法看到錯誤是如何在我的應用程序中造成的。爲什麼我在這裏得到「行未找到或更改」錯誤?

我有一個叫做DataAccess的外觀類,它封裝了多個存儲庫,並在我的應用程序中傳遞。每一個控制器都依賴於DataAccess,所以我把它連接起來以便按需要傳遞出去。

數據訪問看起來大致是這樣的,在截斷/抽象形式:

public class DataAccess : IDataAccess 
{ 
    private MyDataContext DataContext = new MyDataContext(); 

    public Repository1 Repo1 = new Repository1(); 
    public Repository2 Repo2 = new Repository2(); 

    public DataAccess() 
    { 
     Repo1.DataContext = DataContext; 
     Repo2.DataContext = DataContext; 
    } 
} 

然後,每個控制器有像這樣在IDataAccess的依賴:

public class MyControllerBase 
{ 
    [Dependency] 
    IDataAccess DataAccess { get; set; } 
} 

團結手這些出根據顯示的內容爲正常配置,在Global.asax中註冊類型,將控制器連接到工廠,統一解析。此外,我用PerThreadLifetimeManager()註冊它,我不確定是否正確。 -

對於這個偉大工程的大部分不過問題可以通過轉載:

  • 去編輯動作,然後再發布編輯(重定向到索引)
  • 返回到編輯行動和企圖要發佈另一個編輯,或者進入刪除操作並嘗試在同一項目上發佈刪除

這會引發「未找到或未找到行」錯誤。每個操作(編輯和刪除)都會在DataContext上調用SubmitChanges()。所以我不太確定這裏發生了什麼。如果任何人有任何想法,他們會非常好的接受。

乾杯,

Tim。

回答

0

我懷疑每個線程的生命週期在這裏是不合適的 - ASP.NET在請求中重用線程,這會導致在多個請求中重複使用舊的上下文,可能會使它們處於奇怪的狀態。

你有兩個選擇:

  1. 如果您只調用控制器上container.resolve,那麼你可以使用內置的PerResolveLifetimeManager代替。這會爲每個控制器解析提供一個DataAccess對象。
  2. 您可以抓取許多PerRequestLifetimeManager實現中的一個,並根據HttpRequest獲取新的DataAccess對象。

無論哪種方式,我懷疑,讓你擺脫你目前遇到的問題。

+0

非常感謝,這已經解決了我目前遇到的問題。有一個玩弄,我現在有一些新的問題與實施(1),偶爾「試圖附加或添加一個不是新的實體,可能是從另一個DataContext加載」錯誤..有關於此的任何想法? – Hanshan

+0

好吧,通常這意味着你正試圖附加一個已經從另一個上下文中使用過的實體。那實際上是怎麼回事?我不是EF專家(或用戶),所以我真的不能說。 –

+0

謝謝,夥計 - 我必須仔細觀察這一張 - 你在這裏給了我很大的幫助。乾杯。 – Hanshan