2

同じデータコンテキストを共有する作業単位パターンがあります。保存中にエラーが発生した場合は、エラーをキャッチして、次のイベントに進みます。ただし、エラーが発生した元のイベントがまだ追加されているかのように、同じエラーが発生します。元のエラーの原因となった項目を削除するために、作業単位を正常にリセットする方法はありますか? 下のキャッチのアイテムを削除しても、まだ機能しませんでした。

また、イベントのリストを保持して、ID がプロパティで既に取得されているかどうかを確認し、データベースから一度だけ取得しますが、それが重要かどうかはわかりません。

EventsRepository.Add(tournament);

                try
                {
                    UnitOfWork.Commit();
                }
                catch (Exception ex)
                {
                    // Log, Go To Next Event To Process
                }

UnitOfWork.cs

 public class UnitOfWork : IUnitOfWork
    {
        private readonly IDatabaseFactory _databaseFactory;
        private DataContext _dataContext;

        public UnitOfWork(IDatabaseFactory databaseFactory)
        {
            _databaseFactory = databaseFactory;
        }

        protected DataContext DataContext
        {
            get { return _dataContext ?? (_dataContext = _databaseFactory.Get()); }
        }

        public void Commit()
        {
            DataContext.Commit();
        }

        public void SaveChanges()
        {
            DataContext.SaveChanges();
        }

        public void Refresh(object o)
        {
            DataContext.Entry(o);
        }

        public void Commit(bool autoDetectChanges)
        {
            DataContext.Configuration.AutoDetectChangesEnabled = false;
            DataContext.Commit();
            DataContext.Configuration.AutoDetectChangesEnabled = true;
        }
    }
4

1 に答える 1

0

追加されたイベントが原因でコミットが失敗した場合、作業単位も失敗しました。次のイベントを処理する場合は、作業単位の新しいインスタンスを使用する必要があります。これはSaveChanges、各イベントを個別に呼び出し、エラー後に続行する場合は、それらのイベントが同じ作業単位に属していないためです。

失敗したイベントを現在のコンテキストから削除するには、手動でデタッチを試すことができます。

context.Entry(tournament).State = EntityState.Detached;
于 2012-12-29T12:49:08.107 に答える