Какова лучшая стратегия для фиксации изменений с использованием шаблона UnitOfWork? - PullRequest
0 голосов
/ 21 апреля 2019

Какова лучшая стратегия для фиксации изменений с использованием шаблона UnitOfWork?Делать это внутри попробовать?Если мне нужно откатиться, подвох - лучшее место, чтобы сделать это в таком случае?

public void Commit() {
            _context.SaveChanges();
}

public void Rollback() {
            _context
                .ChangeTracker
                .Entries()
                .Where(entry => entry.State != EntityState.Unchanged)
                .ToList()
                .ForEach(entry => {
                    switch (entry.State)
                    {
                        // Under the covers, changing the state of an entity from  
                        // Modified to Unchanged first sets the values of all  
                        // properties to the original values that were read from  
                        // the database when it was queried, and then marks the  
                        // entity as Unchanged. This will also reject changes to  
                        // FK relationships since the original value of the FK  
                        // will be restored. 
                        case EntityState.Modified:
                            entry.State = EntityState.Unchanged;
                            break;
                        case EntityState.Added:
                            entry.State = EntityState.Detached;
                            break;
                        // If the EntityState is the Deleted, reload the date from the database.   
                        case EntityState.Deleted:
                            entry.Reload();
                            break;
                        default: break;
                    }
                });
}
try { 
  UnitOfWorkRPOMain.Commit();
} catch (Exception ex) {
  UnitOfWorkRPOMain.Rollback();
  Logger.Error(baseLog + "Error - ex.Message).");
}

1 Ответ

0 голосов
/ 21 апреля 2019

Попробуй / поймай в порядке.Тем не менее, я собираюсь предложить не оборачивать DbContext в единицу работы.Entity Framework уже реализует шаблоны единиц работы и репозитория.В частности, DbContext является единицей работы, а каждый DbSet является хранилищем.

С учетом этого ваш код может выглядеть примерно так:

sample

using (var context = new YourContext())
{
    using (var transaction = context.Database.BeginTransaction())
    {
        try
        {
            // your code
            context.SaveChanges();
            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            // some logging
        }
    }
}

Подробнее о транзакциях с EF:

https://www.entityframeworktutorial.net/entityframework6/transaction-in-entity-framework.aspx

https://docs.microsoft.com/en-us/ef/ef6/saving/transactions

...