我执行这段代码时遇到以下错误:
private bool _updateList(SysInfo _sysInfo, List<pList> _pList)
{
try
{
foreach (var p in _pList)
{
_context.spUpdatePListApprovalFlow(p.countryID, _sysInfo.User.JobRoleID, p.src, p.id, p.status, _sysInfo.User.Username);
}
return true;
}
catch (Exception ex) //debug only
{
throw; //throws error to the main try catch
}
}
错误
无法执行操作,因为OLE DB提供程序&#34; MSDASQL&#34; 对于链接服务器&#34; AS400_LINKEDSRV&#34;无法开始分发 事务。
但是,当我在SQL Management Studio中运行存储过程时,一切正常:
exec [dbo].[spUpdatePListApprovalFlow]
@CountryID = 123456,
@UserTypeID = 23456,
@Src = 1,
@Id = '123456789',
@Status = 30,
@Username = 'username'
我厌倦了寻找答案,但没有任何作用......我尝试过的事情很少:
这个sp上有2个子存储过程。一个写入应用程序数据库的表,另一个写入as400中的表。
答案 0 :(得分:3)
在EF6中,默认情况下,在显式事务中调用存储过程。您可以通过在创建特定DbContext实例后更改其配置来关闭它,或者通过在构造函数中更改它来为DbContext类型的所有实例关闭它。 EG
using (var db = new Db())
{
db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
//. . .
}
答案 1 :(得分:1)
好的,经过半天试图解决这个问题后,我终于解决了它。
解决强>
从实体框架6降级为实体框架5和实体框架5 分销交易错误已经消失。
只需注意,如果您要执行此操作,则必须更改代码中的一些用法。 (在数据模型中的自动生成代码中)
EF 6 使用
using System.Data.Entity.Core.Objects
EF 5 使用
using System.Data.Objects;
答案 2 :(得分:0)
如果您不需要分布式事务,可以尝试在链接服务器的设置中禁用它们:
EXEC master.dbo.sp_serveroption
@server=N'AS400_LINKEDSRV',
@optname=N'remote proc transaction promotion',
@optvalue=N'false'
答案 3 :(得分:0)
请参阅此Microsoft page on Linked Servers。
您的系统管理员和/或DBA可能需要进行更改以解决AS / 400服务器缺少的链接服务器定义。
另一个可能的问题是AS / 400服务器(来自IBM)缺乏对OLE DB数据源的软件支持。这也是系统管理人员可能需要解决的问题。