1
我使用Mssql作爲ORM/DAL的db和EF4。
我的問題是關於下面的代碼:我應該在刪除之前檢查一行是否存在?
public static void DeleteBuilding(int buildingId, int countryId)
{
PlayerBuilding playerBuilding = new PlayerBuilding()
{
CountryID = countryId,
BuildingID = buildingId
};
Entities.PlayerBuildings.Attach(playerBuilding);
Entities.PlayerBuildings.DeleteObject(playerBuilding);
Entities.SaveChanges();
}
如果行存在這個作品非常好,如果不是我得到一個異常(商店更新,插入或刪除語句影響行的一個意外的數(0)實體可能已被修改或刪除,因爲實體加載刷新ObjectStateManager項)
我應該做一個往返到數據庫中,以檢查是否存在這樣的行:。
public static void DeleteBuilding(int buildingId, int countryId)
{
PlayerBuilding playerBuilding = (from p in Entities.PlayerBuildings
where p.BuildingID == buildingId && p.CountryID == countryId
select p).FirstOrDefault();
if (playerBuilding != null)
{
Entities.PlayerBuildings.DeleteObject(playerBuilding);
Entities.SaveChanges();
}
}
我認爲額外往返是不必要的,因爲如果沒有EF,使用純SQL,我可以簡單地用一個DELETE命令刪除行。
什麼是更好的做法?
感謝您的評論RPM,但這不是一個樂觀的併發問題,我正在開發一個本地開發人員計算機,並非試圖使用靜態方法,也不是問題所在。上下文使用此方法實例化:http://dotnetslackers.com/articles/ado_net/Managing -Entity-Framework-ObjectContext-lifetime-and-scope-in-n-layered-ASP-NET-applications.aspx。使用正常的方式來實例化上下文而不改變任何東西。 – Adir 2010-12-16 14:39:10
看看文章 - 錯誤那個arti cle與你的完全一樣。您是否嘗試在單元測試(單獨)中運行上述代碼?另外 - 你提供的那篇文章中的哪個方法是你實例化上下文的? (該文章中有多種方法) – RPM1984 2010-12-16 20:42:27
我已經使用了UnitOfWorkScope方法,但這不是問題。即使我使用舊方式實例化上下文(MyContext context = new MyContext()),仍然會顯示相同的錯誤。我不認爲它與併發有關,錯誤顯示是因爲我試圖刪除上下文中不存在的對象。 – Adir 2010-12-17 11:54:11