Проблема с Entity Framework и TransactionScope complete () - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь реализовать объем транзакции в UnitOfWork вместе с Entity Framework.В следующем коде, когда я отправляю запрос на публикацию в API (branchcontroller), первичный ключ добавленного объекта;ветвь автоматически увеличивается на 1, но не вставляется в базу данных SQL при вызове метода _UnitofWork.Commit().

Консоль вывода показывает, что branch.id изменяется с 0 на целочисленное значение, но добавленные данные не вставляются в таблицу SQL Server.Тем не менее, все работает нормально, если я не использую объем транзакции.Я не могу понять причину этого.Я был бы очень признателен за любую помощь, предложение или направление.

public class UnitofWork : IUnitofWork
{
   public UnitofWork()
   {
      _context = new SolutionsContext();
      Branches = new BranchRepository(_context);
   }

   private readonly SolutionsContext _context; //dbcontext
   private TransactionScope _transaction;

   public int Complete()
   {
      return _context.SaveChanges();        
   }

   public void StartTransaction()
   {
      _transaction = new TransactionScope();
   }

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

   // I also tried to do it another way with EF's transaction approach inside the same function commit() but the result was same.
   public void Commit()
   {
       using (var transaction = _context.Database.BeginTransaction())
       {
          try
          {
             _context.SaveChanges(); //dbContext.SaveChanges();
             transaction.Commit();
          }
          catch (Exception ex)
          {
             transaction.Rollback();
          }
        }
   }

   public DbContext Context
   {
        get { return _context; }
   }

   public void Dispose()
   {
      _context.Dispose();
   }
}

public class BranchController : BaseController
{
    //Injecting Unit of Work
    public BranchController(IUnitofWork unitofWork) : base(unitofWork)
    {
    }

    //POST /api/branch
    [HttpPost]
    public IHttpActionResult Create(BranchDto branchDto)
    {
        if (!ModelState.IsValid)
        {
           throw new HttpResponseException(HttpStatusCode.BadRequest);
        }

        _UnitofWork.StartTransaction();

        var branch = Mapper.Map<BranchDto, Branch>(branchDto);

        UnitofWork.Branches.Add(branch);
        Debug.WriteLine(branch.Id);  //Output 1

        _UnitofWork.Commit();
        Debug.WriteLine(branch.Id);  //output 2

        return Created(new Uri(Request.RequestUri + "/" + branch.Id), Mapper.Map<Branch, BranchDto>(branch)); //branch with ID
     }
}

// Branch Class
public class Branch
{
        public int Id { get; set; }
        public string BranchCode { get; set; }
        public string Description { get; set; }
        public IList<SalesHeader> SalesHeaders { get; set; }
}

// Fluent API Entity Configuration
public class BranchConfiguration: EntityTypeConfiguration<Branch>
{
        public BranchConfiguration()
        {
            HasKey(k => k.Id);
        }
}

Значения, записанные Debug.writeline(branch.Id) в окно вывода:

//output from debug
'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-132064375619636910): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
0    (This is the result of output 1)
5062    (This is the result of output 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...