C# 我如何解决这个问题;此事务已完成;它不再可用了吗?(linq/EF)

C# 我如何解决这个问题;此事务已完成;它不再可用了吗?(linq/EF),c#,linq,.net-core,transactions,entity-framework-core,C#,Linq,.net Core,Transactions,Entity Framework Core,我有一个数据库第一,.net核心2.1实体框架剃须刀页面应用程序。创建银行应用程序是一个家庭作业问题,但我不知道为什么这一小部分不起作用。当我将代码分解成不同的方法时,我的事务无法完成,甚至无法正确回滚。我得到的错误是“此SqlTransaction已完成;它不再可用”。当我将代码从单独的方法中拉出来并放入“TransferCheckingToSave”时,它工作正常 我尝试将事务变量作为输入传递给每个子方法,这些方法不会出错。当它在“TransferCheckingToSave”中开始提交时,

我有一个数据库第一,.net核心2.1实体框架剃须刀页面应用程序。创建银行应用程序是一个家庭作业问题,但我不知道为什么这一小部分不起作用。当我将代码分解成不同的方法时,我的事务无法完成,甚至无法正确回滚。我得到的错误是“此SqlTransaction已完成;它不再可用”。当我将代码从单独的方法中拉出来并放入“TransferCheckingToSave”时,它工作正常

我尝试将事务变量作为输入传递给每个子方法,这些方法不会出错。当它在“TransferCheckingToSave”中开始提交时,它抛出错误

public bool TransferCheckingToSaving(长支票账户、长储蓄账户、十进制金额、十进制交易费)
{
bool-ret=假;
使用(var contextTransaction=_context.Database.BeginTransaction())
{
尝试
{
bool updatesavingsuccessuccess=UpdateSavingBalanceTR(savingAccountNum、amount、contextTransaction);
if(updateSaveSuccess!=true)
抛出新异常(“从支票转移到储蓄时,储蓄账户余额未成功更新”);
bool updateCheckingSuccess=UpdateCheckingBalanceTR(checkingAccountNum,-1*金额,contextTransaction);
if(updateCheckingSuccess!=true)
抛出新异常(“从支票转移到储蓄时支票账户余额未成功更新”);
bool addToTransHistSuccess=AddToTransactionHistory(检查AccountNum、savingAccountNum、amount、100、0、contextTransaction);
if(addToTransHistSuccess!=真)
抛出新异常(“从检查转移到保存时更新事务历史记录失败”);
其他的
{
_SaveChanges();
contextTransaction.Commit();
ret=真;
CacheAbstraction cabs=新的CacheAbstraction();
cabs.Remove(cachenameacade.TRCACHENAME+“:”+checkingAccountNum);
}
}
捕获(例外情况除外)
{
contextTransaction.Rollback();
掷骰子;
}
}
返回ret;
}

私有bool UpdateCheckingBalanceTR(长支票帐户、十进制金额、IDbContextTransaction)
{
bool-ret=假;
尝试
{
使用(事务)
{
CheckingAccounts checkingAcct=(来自_context.CheckingAccounts中的c.CheckingAccountNumber==checkingAccountNum选择c);
核对现金余额+=(十进制)金额;
如果(检查现金余额<0)
抛出新异常(““+(checkingact.balance-=amount).ToString()+”的检查余额太低,无法完成此事务”);
_SaveChanges();
ret=真;
返回ret;
}
}
捕获(例外)
{
投掷;
}
//返回ret;
}

private bool UpdateSavingBalanceTR(long savingAccountNum、十进制金额、IDbContextTransaction)
{
bool-ret=假;
尝试
{
使用(事务)
{
SavingAccounts savingAcct=(从_context.SavingAccounts中的s开始,其中s.SavingAccountNumber==savingAccountNum选择s);
储蓄账户余额+=(十进制)金额;
如果(储蓄现金余额<0)
抛出新异常(“检查“+(savingAcct.balance-=amount).ToString()+”的余额太低,无法完成此事务”);
_SaveChanges();
ret=真;
返回ret;
}
}
捕获(例外)
{
投掷;
}
}

private bool AddToTransactionHistory(长支票帐户、长储蓄帐户、十进制金额、int transTypeId、十进制transFee、IDbContextTransaction)
{
bool-ret=假;
尝试
{
使用(事务)
{
TransactionHistories transHist=新TransactionHistories
{
CheckingAccountNumber=checkingAccountNum,
SavingAccountNumber=savingAccountNum,
金额=金额,
交易费=transFee,
TransactionTypeId=(长)transTypeId,
};
_context.TransactionHistories.Add(transHist);
CacheAbstraction cabs=新的CacheAbstraction();
cabs.Remove(cachenameacade.TRCACHENAME+“:“+checkingAccountNum);//对于每个唯一的用户,检查帐户都是相同的
_SaveChanges();
ret=真;
返回ret;
}
}
捕获(例外)
{
投掷;
}
}

我希望事务能够成功完成,但它会抛出错误“This SqlTransaction has completed;it's note available.”有人能给我指出正确的方向吗?

您根本不需要将事务传递给帮助器方法;您应该在事务生命周期中只调用一次
DbContext.SaveChanges()
。真的吗?我想那就行了。最近在我的课堂上,我们从编写sql转到了实体框架,所以我还没有完全习惯它。我下班回家后会试试这个。谢谢。注意马克·本宁菲尔德的解决方案是正确的。看来我无法将此标记为已解决。可能是因为我是新手?您根本不需要将事务传递给helper方法;您应该在事务生命周期中只调用一次
DbContext.SaveChanges()
。真的吗?我想那就行了。最近在我的课堂上,我们从编写sql转到了实体框架,所以我还没有完全习惯它。我下班回家后会试试这个。感谢