There is a problem when we are running different transactions and jumping from one appservice to the other but some how following error arises with in the transactions: : 'Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. Object name: 'ERPDbContext'.' Please explain
12 Answer(s)
-
0
- What is your product version?
- What is your product type (Angular or MVC)?
- What is product framework type (.net framework or .net core)?
Please share some code.
-
0
.net core and angular
-
0
hi @CNS
Please share some related code. :)
-
0
1 Step :
private async void ProcessReceiptTransfer(VoucherPostingDto input) { var receiptHeader = _porecHeaderRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId && o.DocNo >= input.FromDoc && o.DocNo <= input.ToDoc && o.Posted == false).ToList(); foreach (var item in receiptHeader) { CreateOrEditPORECHeaderDto receipt = new CreateOrEditPORECHeaderDto() { Id = item.Id }; await _receiptEntryAppService.ProcessReceiptEntry(receipt); } }
2 Step:
public async Task<string> ProcessReceiptEntry(CreateOrEditPORECHeaderDto input) { var alertMsg = ""; var currency = _voucherEntryAppService.GetBaseCurrency(); var user = _userRepository.GetAll().Where(o => o.Id == AbpSession.UserId).SingleOrDefault().UserName; var transBook = _icSetupRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId).SingleOrDefault().TRBookID; var receiptHeader = _porecHeaderRepository.FirstOrDefault(o => o.TenantId == AbpSession.TenantId && o.Id == input.Id); var receiptDetail = _porecDetailRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId && o.DetID == input.Id); var icItem = _itemRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId); string narration = receiptHeader.Narration; var additionalData = _icrecaExpRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId && o.LocID == input.LocID && o.DocNo == input.DocNo); List<CreateOrEditGLTRDetailDto> gltrdetailsList = new List<CreateOrEditGLTRDetailDto>(); var transferDetailList = from o in receiptDetail join i in icItem on new { A = o.ItemID, B = o.TenantId } equals new { A = i.ItemId, B = i.TenantId } group o by new { i.Seg1Id } into gd select new PORECDetailDto { Amount = gd.Sum(x => x.Amount), ItemID = gd.Key.Seg1Id, }; foreach (var item in transferDetailList) { var caID = _inventoryGlLinkRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId && o.LocID == receiptHeader.LocID && o.SegID == item.ItemID).FirstOrDefault().AccRec; var daID = _inventoryGlLinkRepository.GetAll().Where(o => o.TenantId == AbpSession.TenantId && o.LocID == receiptHeader.LocID && o.SegID == item.ItemID).FirstOrDefault().AccRec; //Credit Amount gltrdetailsList.Add(new CreateOrEditGLTRDetailDto { Amount = -Convert.ToDouble(item.Amount), AccountID = caID, Narration = narration, SubAccID = 0, LocId = receiptHeader.LocID, IsAuto = true }); //Debit Amount gltrdetailsList.Add(new CreateOrEditGLTRDetailDto { Amount = Convert.ToDouble(item.Amount), AccountID = daID, Narration = narration, SubAccID = 0, LocId = Convert.ToInt32(receiptHeader.LocID), IsAuto = false }); } foreach (var item in additionalData) { //Debit Amount gltrdetailsList.Add(new CreateOrEditGLTRDetailDto { Amount = Convert.ToDouble(item.Amount), AccountID = item.AccountID, Narration = narration, SubAccID = 0, LocId = Convert.ToInt32(item.LocID), IsAuto = false }); } VoucherEntryDto autoEntry = new VoucherEntryDto() { GLTRHeader = new CreateOrEditGLTRHeaderDto { BookID = transBook, NARRATION = narration, DocDate = Convert.ToDateTime(receiptHeader.DocDate), DocMonth = Convert.ToDateTime(receiptHeader.DocDate).Month, Approved = true, AprovedBy = user, AprovedDate = DateTime.Now, Posted = false, LocId = receiptHeader.LocID, CreatedBy = user, CreatedOn = DateTime.Now, AuditUser = user, AuditTime = DateTime.Now, CURID = currency.Id, CURRATE = currency.CurrRate, ConfigID = 0 }, GLTRDetail = gltrdetailsList }; if (autoEntry.GLTRDetail.Count() > 0 && autoEntry.GLTRHeader != null) { var voucher = await _voucherEntryAppService.ProcessVoucherEntry(autoEntry); receiptHeader.Posted = true; //receiptHeader.PostedBy = user; // receiptHeader.PostedDate = DateTime.Now; receiptHeader.LinkDetID = voucher[0].Id; var transh = await _porecHeaderRepository.FirstOrDefaultAsync((int)receiptHeader.Id); ObjectMapper.Map(receiptHeader, transh); alertMsg = "Save"; } else { alertMsg = "NoRecord"; } return alertMsg; }
3 Step:
public async Task<List<GLTRHeaderDto>> ProcessVoucherEntry(VoucherEntryDto input) { var gltrHeader = ObjectMapper.Map<GLTRHeader>(input.GLTRHeader); if (AbpSession.TenantId != null) { gltrHeader.TenantId = (int)AbpSession.TenantId; } gltrHeader.DocNo = GetMaxDocId(input.GLTRHeader.BookID); var getGenratedId = await _gltrHeaderRepository.InsertAndGetIdAsync(gltrHeader); foreach (var item in input.GLTRDetail) { var gltrDetail = ObjectMapper.Map<GLTRDetail>(item); if (AbpSession.TenantId != null) { gltrDetail.TenantId = (int)AbpSession.TenantId; } gltrDetail.LocId = input.GLTRHeader.LocId; gltrDetail.DetID = getGenratedId; await _gltrDetailRepository.InsertAsync(gltrDetail); } List<GLTRHeaderDto> returnList = new List<GLTRHeaderDto>(); returnList.Add(new GLTRHeaderDto { Id=getGenratedId, DocNo = gltrHeader.DocNo, LocId=gltrHeader.LocId }); return returnList; }
-
0
Don't use void as the return type of an asynchronous method.
private async void ProcessReceiptTransfer(VoucherPostingDto input)
should beprivate async Task ProcessReceiptTransfer(VoucherPostingDto input)
Please share your abp version and complete exception information (including other logs before and after the error.)
-
0
where to know about the abp version
-
0
where to know about the abp version
And
Don't use void as the return type of an asynchronous method. private async void ProcessReceiptTransfer(VoucherPostingDto input) should be private async Task ProcessReceiptTransfer(VoucherPostingDto input) Please share complete exception information (including other logs before and after the error.)
-
0
System.ObjectDisposedException: 'Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. Object name: 'ERPDbContext'.'
Your app has entered a break state, but there is no code to show because all threads were executing external code (typically system or framework code).
this error arises normally when 2 time loop executed
-
0
hi @CNS
Can you use Zero's demo project to create a simple project that reproduces the problem? Use the simplest code to reproduce the problem.
Please share the project with me: [email protected]
-
0
all other services are working fine but on this service we are facing problem. I already shared whole problematic code with you.
-
0
It would be best if you could share a simple demo project for me. : )
-
0
@CNS
Don't use void as the return type of an asynchronous method.
private async void ProcessReceiptTransfer(VoucherPostingDto input)
should beprivate async Task ProcessReceiptTransfer(VoucherPostingDto input)
- Have you made the change above?
- Can you share code for the caller of
ProcessReceiptTransfer
method?