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 回答