[EF]Entity Framework 4.1亂拋EntitySqlException的BUG
Entity Framework 4.1亂拋EntitySqlException的BUG
羅朝輝 (http://kesalin.cnblogs.com/)
今天在使用 Entity Framework 處理并發(fā)沖突時(shí),碰到一個(gè)奇怪的BUG:
引發(fā) BUG 的代碼:
try
{
if (ModelState.IsValid)
{
db.Entry(entityObject).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var databaseValues = (XXXProject.Models.XXXEntity)entry.GetDatabaseValues().ToObject();
var clientValues = ( XXXProject .Models. XXXEntity )entry.Entity;
......
}
BUG現(xiàn)象:
EntitySqlException: Type 'XXXProject.Models.XXXEntity' could not be found. Make sure that the required schemas are loaded and that the namespaces are imported correctly.
BUG原因:
DBContext 實(shí)例和 Model entity 不在同一個(gè)命名空間下,Entity Framework 4.1 中的 GetDatabaseValues()就會(huì)拋出異常。經(jīng)查證,這是 Entity Framework 4.1 的一個(gè)BUG,詳細(xì)討論請(qǐng)參看:這里。
解決方案之一:
var clientValues = (Department)entry.CurrentValues.Clone().ToObject();
entry.Reload();
var databaseValues = (Department)entry.CurrentValues.ToObject();
這樣就避開了對(duì) GetDatabaseValues()的調(diào)用,而同時(shí)能獲取到客戶端的值以及服務(wù)器端的值。唯一要注意的是 entry 已經(jīng)重新 Reload 了,之前客戶端做出的修改如果想要保持就得在 Reload 之前備份。
解決方案之二:
將 DBContext 實(shí)例和 Model entity 放到同一個(gè)命名空間下,這樣就滿足 GetDatabaseValues() 的約束條件了。
不推薦使用這種方案,因?yàn)檫@樣修改代碼較多,且違背分層隔離原則。
浙公網(wǎng)安備 33010602011771號(hào)