1

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();
}

行が存在する場合、これは非常にうまく機能します。そうでない場合は、例外が発生します( Store update、insert、または delete ステートメントが予期しない数の行 (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 コマンドで行を簡単に削除できるため、余分なラウンドトリップは不要だと思います。

より良い習慣は何ですか?

4

1 に答える 1

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 オプティミスティック コンカレンシーに関する優れた記事がここにあります。この記事では、エラーが発生する理由と、エラーに対処するために実行できる手順について詳しく説明しています。

于 2010-12-15T22:38:00.167 に答える