2013-03-01 87 views
0

我有一個.Net Mvc項目,我的Databasecontext出現問題。更新/ saveChanges更具體。當我使用方法(下面)中的調試點調試代碼時,它會接合工作,但不是沒有調試點。我不明白爲什麼? SaveChanges不知何故檢測到對實體的更改。SaveChanges爲什麼不檢測對實體的更改?

var user = DatabaseContext.Users.Single(u => u.Id == userId && u.Newsdesk.Id == newsdeskId); 
user.Newsdesk = null; 
DatabaseContext.Update(user); 
DatabaseContext.SaveChanges(); 

在DatabaseContext我的更新方法是這樣的:

public T Update<T>(T entity) where T : class 
    { 
     var set = Set<T>().Attach(entity); 
     Entry(entity).State = EntityState.Modified; 
     return set; 
    } 

如果有人可以點我在正確的方向,我將非常感激

回答

2

迅速,迅速出(這就是甘道夫說在其中的一部電影... :) 我認爲)。

,我的意思是,如果一些虔誠的觀察者所坐的CPU裏面找你的應用程序, 他們應該看到的是,你的應用程序運行下列順序

{連接,創造情境,進行更改,提交它們,銷燬上下文,斷開連接}

對於(幾乎)每個接收到的Web請求,其數十毫秒。

實際上,您是否正在創建全局應用程序中存在的上下文(實體容器+工作單元) ?

我會建議一個更經典的和不那麼DBConnection進行友好的方式(更不用提事務 - 消毒):

using (var context = DataContextHelper.CreateContext()) { 
    var user = DataContextHelper.QueryAndSingleByLambdaBasedOnContext(
     context, 
     u => u.Id == userId && u.Newsdesk.Id == newsdeskId 
    ); 
    if (null == user) 
     // complain somehow (by exception or special return value) 
    user.Newsdesk = null; 

    // don't mark it anymore, in the straight-forward, good'ol way 
    // user will already have been marked 
    //DatabaseContext.Update(user); 

    context.SaveChanges(); 
} 

這是普遍不好(特別是如果你不小心)以某種方式主機 一個全局可訪問的上下文,多個線程可以同時使用。

我不是在談論訪問某些屬性時的併發危害。 我正在談論大圖 (也許另一個請求讀取用戶並將其標記爲「未被修改」 UpdateSaveChanges之間)。

事件如果不是這種情況,你不應該擔心與db的併發連接。併發訪問上下文更難以管理。

+0

感謝您的快速響應。數據庫上下文在控制器的構造函數中創建。這是使用數據庫上下文的不好的方式嗎? – bassen 2013-03-01 14:55:45

+0

可能與否。我不想傷害許多有經驗的成員的特質,這就是爲什麼我不說** YES **。但總的來說,答案是:**是**!特別是如果你不知道自己在做什麼,並對EF和.NET有廣泛而深入的理解。嘗試儘可能少地「保持連接到數據庫」。創建一個小的_business logic_容器類,您可以在其中操作對數據庫所做的更改(以及讀取操作)。使其成爲應用程序的其他部分沒有提及**上下文**(儘可能)這個詞。通過這個改變你可以解決問題 – 2013-03-01 15:08:20

+0

感謝Eduard的幫助!你的回答對我很有幫助。現在我必須決定是否值得重構databasecontext的實現。目前,我在這裏找到了解決我的問題的方法。 http://stackoverflow.com/questions/6420976/setting-a-foreign-key-to-null-when-using-entity-framework-code-first – bassen 2013-03-04 14:56:12

相關問題