Entity framework 实体框架和PostgreSQL:调用存储过程时发生异常

Entity framework 实体框架和PostgreSQL:调用存储过程时发生异常,entity-framework,stored-procedures,ado.net,npgsql,edmgen,Entity Framework,Stored Procedures,Ado.net,Npgsql,Edmgen,我正在尝试使用Microsoft实体框架连接PostgreSQL数据库 由于npgsql数据库提供程序没有集成到VisualStudio中,我正在使用EdmGen工具从现有数据库生成接口代码 数据库还包括一个用于测试的存储过程:它不接受任何参数并返回void。EdmGen不会为此存储过程生成任何代码,但它包含在生成的ssdl文件中。因此,我编写了一个小工具,它修改了csdl和msl文件,以包括这个过程。 这是三个文件的简化视图: ssdl: 我使用以下代码调用此函数: using (var ct

我正在尝试使用Microsoft实体框架连接PostgreSQL数据库

由于npgsql数据库提供程序没有集成到VisualStudio中,我正在使用EdmGen工具从现有数据库生成接口代码

数据库还包括一个用于测试的存储过程:它不接受任何参数并返回void。EdmGen不会为此存储过程生成任何代码,但它包含在生成的ssdl文件中。因此,我编写了一个小工具,它修改了csdl和msl文件,以包括这个过程。 这是三个文件的简化视图:

ssdl:

我使用以下代码调用此函数:

using (var ctx = new TestContext())
{
    ctx.TestFunc();
}
但我有以下例外:

[System.Data.EntityCommandCompliationException]
准备命令定义时出错。有关详细信息,请参见内部异常

内部例外是:

[系统参数异常]
值不在预期范围内

我不知道这个异常是从哪里来的,因为没有要传递给存储过程或从存储过程传递的值。也许你们能帮我

可能也很重要的几点:

  • 这是我的
    app.config
    中的连接字符串:

    <connectionStrings>
        <add name="TestContext" 
             providerName="System.Data.EntityClient" 
             connectionString="metadata=res://Test/Test.Database.Test.csdl|res://Test/Test.Database.Test.ssdl|res://Test/Test.Database.Test.msl; provider=Npgsql; provider connection string=&quot;Server=localhost;Port=5432;Database=Test;User Id=xxx;Password=xxx;enlist=true;&quot;"/>
    </connectionStrings>
    
    
    
  • 我正在使用以下软件版本:

    • Visual Studio Express for Desktop 2012
    • npgsql 2.0.11.0
  • 我对实体框架和ADO.NET完全陌生,对C#、.NET和Visual Studio也很陌生。所以我可能误解了一些概念


我发现异常来自npgsql,方法NpgsqlServices.TranslateCommandTree(…),显然这个方法不是为存储过程调用的。这是实体框架中的一个bug?但我不是唯一一个尝试使用实体框架调用PostgreSQL存储过程的人!?!你好我查一下。您是否可能打开一个关于该问题的bug报告,并附上您的测试用例,以便我们可以尝试一下?提前谢谢。
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
  <EntityContainerMapping StorageEntityContainer="TestStoreContainer" CdmEntityContainer="TestContext">
     <FunctionImportMapping FunctionImportName="TestFunc" FunctionName="Test.Store.TestFunc" />
  </EntityContainerMapping>
</Mapping>
public int TestFunc()
{
    return base.ExecuteFunction("TestContext.TestFunc");
}
using (var ctx = new TestContext())
{
    ctx.TestFunc();
}
<connectionStrings>
    <add name="TestContext" 
         providerName="System.Data.EntityClient" 
         connectionString="metadata=res://Test/Test.Database.Test.csdl|res://Test/Test.Database.Test.ssdl|res://Test/Test.Database.Test.msl; provider=Npgsql; provider connection string=&quot;Server=localhost;Port=5432;Database=Test;User Id=xxx;Password=xxx;enlist=true;&quot;"/>
</connectionStrings>