2014-04-03 19 views
2

我有一些代碼(比這個例子更復雜的),我不明白爲什麼FirstOrDefault通話,這清楚地往返於DB,是不是從數據庫返回一個新的實體:爲什麼EF在FirstOrDefault調用(EF6)後沒有從DB返回實體?

var dbContext = new MyDBContext(); 

// this will not round-trip to Db if found in context 
var user = this.dbContext.EFUsers.Find(someUID); 

// some other work here with 'user' 

this.dbContext.ObjectContext.Detach(user); 

// stuff in disconnected mode 
var newUser = new EFUser() { UID = someUID }; 
// stuff in disconnected mode 

this.dbContext.EFUsers.Attach(newUser); 

// finish working with newUser 
// (eg. deletion of many-to-many relation to avoid loading related entities in memory) 

user = this.dbContext.EFUsers.FirstOrDefault(us => us.UID == someUID); 

// I would expect at this point that 'user' will be queried with fresh values from DB, 
// In reality, I get back only the entity with UID filled in, 'newUser' from above 


// some update user goes here which fails because of the above 

dbContext.SaveChanges(); 

我認爲Find將從上下文返回給我用戶(如果可用),但FirstOrDefault始終是具有來自數據庫的新值的用戶。

任何人都可以解釋一下嗎?我將如何克服這種影響?

回答

3

值得一讀這http://msdn.microsoft.com/en-us/data/jj573936

「當結果從數據庫,不 的背景下,存在被附加到上下文對象返回。如果對象是 已經在上下文,則返回現有對象(當前的 和條目中對象屬性的原始值不是用數據庫值覆蓋的 )。「

加載和重載方法也值得一讀。 聽起來像你想要的那種行爲。

http://msdn.microsoft.com/en-us/data/jj592911.aspx
http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.113).aspx

相關問題