我使用Mssql作为数据库,使用EF4作为ORM / DAL 我的问题是关于以下代码:
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命令删除该行。
什么是更好的做法?
答案 0 :(得分:0)
该错误是Entity Framework的乐观并发的副作用。
基本上,其他人可能已经删除了您检索它之间的记录。或者也许你在该代码之前已经对实体做了一些事情。
尝试在隔离环境(例如单元测试)中运行它,看看你是否仍然遇到问题。
是的,您可以安全地播放并再次获取记录,或者您可以使用 ObjectContext.Refresh :
public static void DeleteBuilding(int buildingId, int countryId)
{
PlayerBuilding playerBuilding = new PlayerBuilding()
{
CountryID = countryId,
BuildingID = buildingId
};
try
{
Entities.PlayerBuildings.Attach(playerBuilding);
Entities.PlayerBuildings.DeleteObject(playerBuilding);
Entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
Entities.Refresh(RefreshMode.ClientWins, playerBuilding);
Entities.SaveChanges();
}
}
旁注 - 可能是因为您的方法静态?你如何实例化你的背景?我希望你没有使用单身人士。 :(
有一篇关于EF乐观并发here的优秀文章,它更详细地解释了为什么你会收到这个错误,以及可以采取哪些措施来对付它。