2014-02-27 45 views
0

在我的代碼,如果我從的EntityFramework存儲庫中獲得對象(例如用戶對象):獲取一直是相同的值

User GetUser(string name) 
    { 
    return user = _repo.Get<User>(user=>user.name=name); 
    } 

    void Main() 
    { 

    var user0 = GetUser("foo");//user.pass==245 in Database 

    user0.pass=345; //Change user.pass in user0 variable 

    var user1=GetUser("foo");//user.pass==345 in Database !!!!! 
    } 

爲什麼在main方法的線-3時,我想再次從數據庫獲取用戶,user1.pass == 345但是在數據庫中是真實的245 ???

+0

你的回購中有保存方法嗎? –

+0

@Pedro是的,我有保存方法! –

+0

因爲你已經物化了'User'和對象'user1'與'user0'相同。檢查'user0 == user1'的結果。 –

回答

0

當您更改user0對象時,實際上是在更改數據庫的EF表示。您所做的任何更改都將保留在EF中,直到您調用SaveChanges,然後它將保存對數據庫的更改。

如果您在更改後調用了Get回購,EF框架將識別出您已經爲相同的實體調用了Get,並將返回它的foo用戶副本而不是訪問數據庫。

爲避免EF緩存您要帶回的對象,您可以在您第一次返回foo用戶時使用.AsNoTracking方法。這將應用於_repo.Get<User>(user=>user.name=name)行,或者可能在執行Get方法時使用,具體取決於_repo和Get的返回結果。

+0

我應該怎麼做才能解決這個問題 –

+0

@nocamer - 我已經編輯了我的答案,以包含避免緩存的潛在步驟 – thudbutt