我应该在删除前检查是否存在行?

时间:2010-12-15 22:22:51

标签: asp.net entity-framework entity-framework-4 optimistic-concurrency

我使用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命令删除该行。

什么是更好的做法?

1 个答案:

答案 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优秀文章,它更详细地解释了为什么你会收到这个错误,以及可以采取哪些措施来对付它。

相关问题