无法使用Entiy Framework

时间:2017-08-18 12:41:37

标签: c# sql-server entity-framework stored-procedures ibm-midrange

我执行这段代码时遇到以下错误:

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'

我厌倦了寻找答案,但没有任何作用......我尝试过的事情很少:

  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • 在存储过程中插入多个事务

这个sp上有2个子存储过程。一个写入应用程序数据库的表,另一个写入as400中的表。

4 个答案:

答案 0 :(得分:3)

在EF6中,默认情况下,在显式事务中调用存储过程。您可以通过在创建特定DbContext实例后更改其配置来关闭它,或者通过在构造函数中更改它来为DbContext类型的所有实例关闭它。 EG

    using (var db = new Db())
    {
        db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
        //. . .
    }

请参阅:https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.ensuretransactionsforfunctionsandcommands

答案 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数据源的软件支持。这也是系统管理人员可能需要解决的问题。