Я пытаюсь реализовать объем транзакции в 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)