0

私はこのプロジェクトに取り組んでおり、エンティティを保存するフォームがあり、保存する前に、データベース上のエンティティの一意の属性をチェックして、レコードが存在しないことを確認します。

これは、フォームの送信ボタンを非常にすばやく複数回押すシナリオを除いて、正常に機能します。この場合、データベースチェックは機能せず、データベースにレコードの複数のエントリが作成されます。

アプリケーションの設計上の問題だと思いますが、作業単位のパターンが初めてで、なぜ動作しないのかわかりません。

これは、サービスレイヤーで行うチェックです。

    IEnumerable<Story> Stories = _unitOfWork.StoryRepository.Get(s => e.GUID.Equals(GUID));
    if (Stories.Count() > 0)
    {
        _unitOfWork. StoryRepository.Insert(newStory);
        _unitOfWork.Save();
    }

誰かがこの問題を手伝ってくれる?

ところで、私はjavascriptベースのソリューションを求めているのではなく、サーバー側だけを求めています。

ありがとう

編集:サービスはninjectを使用し、作業単位を渡すコンストラクターを持っています:

    private IUnitOfWork _unitOfWork;

    public StoryService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

私のUnitOfWorkクラスは次のように宣言されています:

public class UnitOfWork : Disposable, IUnitOfWork

DatabaseFactory.cs:

public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private myContext _dataContext;
    private readonly object _door = new object();

    public myContext Get()
    {
        lock (_door)
        {
            return _dataContext ?? (_dataContext = new myContext());
        }
    }

    protected override void DisposeCore()
    {
        if (_dataContext != null)
            _dataContext.Dispose();
    }
}

Plucが提案しているように、サービスのメソッドを呼び出すたびにUnitOfWorkのインスタンスを作成する必要がありますか?

4

1 に答える 1

0

作業単位の作成が早すぎる可能性があります。作業単位は IDisposable エンティティである必要があります。これにより、必要なときに使用でき、すぐに削除できます。using ステートメントは、この状況では非常に優れています。

using(var unitOfWork = new UnitOfWork())
{
    IEnumerable<Story> Stories = unitOfWork.StoryRepository.Get(s => e.GUID.Equals(GUID));
    if (Stories.Count() > 0)
    {
        unitOfWork.StoryRepository.Insert(newStory);
        unitOfWork.Save();
    }
}

UnitOfWork が非常に早い段階で作成され、StoryRepository が早い段階で別の機会に使用される場合、ストーリーは既に読み込まれています。送信を 2 回クリックすると、ページの読み込み速度に応じて、リクエスト #1 の UnitOfWork がリクエスト #2 の遅延ロードの前にコンテキストを保存しない場合、両方のリクエストがストーリーのまったく同じリストと条件は両方に合格します。

必要に応じて UnitOfWork を作成すると、ストーリーが読み込まれることさえないため、悪い状態のテストを行う唯一のウィンドウは、.Get() リポジトリ メソッドと unitOfWork.Save の間の 0.001ms です。 ().

UnitOfWork は、すべてのクエリを一度にバッチ処理することでデータ アクセスを最適化するためのものであることに常に留意してください。これはデータ キャッシング ツールではありません。作成し、使用し、ダンプします。1 回の Web リクエストで 2 回以上作成しても害はありません。

于 2012-10-31T12:01:13.790 に答える