我正在开发一个基于asp.net核心mvc的博客项目,并尝试在ubuntu 16.04 LTS x86-64上部署我的项目。
在将对象插入sql server时,使用transactionScope和dapper时遇到了空引用异常。
SQL Server版本是:在Windows 2012SP1系统上运行的12.0.4100.1。 并且代码在Windows 10(OS Build 17074.1002)上正常运行。 但是当我将项目部署到Ubuntu时,它会抛出空引用异常。
例外情况如下:
{System.NullReferenceException:对象引用未设置为对象的实例。在 System.Data.ProviderBase.DbConnectionPool.DeactivateObject(DbConnectionInternal obj)at System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj,Object owningObject)at System.Data.ProviderBase.DbConnectionInternal.CloseConnection(的DbConnection owningObject,DbConnectionFactory connectionFactory)at System.Data.SqlClient.SqlConnection.CloseInnerConnection()at System.Data.SqlClient.SqlConnection.Close()at Dapper.SqlMapper.d__64 1.MoveNext()in C:\ projects \ dapper \ Dapper \ SqlMapper.Async.cs:第1191行 ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()at Autyan.NiChiJou.Repository.Dapper.BaseDapperRepository 1.d__22.MoveNext()在/home/alex/Documents/Github/Autyan.NiChiJou/src/Autyan.NiChiJou.Repository.Dapper/BaseDapperRepository.cs:line 167 ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()at Autyan.NiChiJou.Repository.Dapper.LongKeyDapperRepository 1.d__1.MoveNext()在/home/alex/Documents/Github/Autyan.NiChiJou/src/Autyan.NiChiJou.Repository.Dapper/LongKeyDapperRepository.cs:line 23 ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()at Autyan.NiChiJou.Service.Blog.ArticleService.d__10.MoveNext() 在 /home/alex/Documents/Github/Autyan.NiChiJou/src/Autyan.NiChiJou.Service.Blog/ArticleService.cs:line 39}
抛出异常的代码是这样的:
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
var create = await ArticleRepo.InsertAsync(article);
if (create <= 0)
{
return Failed<Article>("create article failed");
}
create = await ContentRepo.InsertAsync(new ArticleContent
{
ArticleId = create,
Content = content
});
if (create <= 0)
{
return Failed<Article>("create articleContent failed");
}
scope.Complete();
}
我试图删除transactionScope,之后,我的代码运行得很好
新代码就像:
var create = await ArticleRepo.InsertAsync(article);
if (create <= 0)
{
return Failed<Article>("create article failed");
}
create = await ContentRepo.InsertAsync(new ArticleContent
{
ArticleId = create,
Content = content
});
if (create <= 0)
{
return Failed<Article>("create articleContent failed");
}
我是否以错误的方式使用trancsationScope?或者它只是来自dotnet核心本身的一个错误?
答案 0 :(得分:0)
这是因为当await结束时,分配给继续执行await之后的语句的线程已经丢失了原始执行线程所拥有的事务上下文。
将您的Txn范围定义为:
using (var scope = new TransactionScope(..., TransactionScopeAsyncFlowOption.Enabled))