实体框架和PostgreSQL:调用存储过程时的异常

时间:2013-05-11 13:36:29

标签: entity-framework stored-procedures ado.net npgsql edmgen

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

由于npgsql数据库提供程序未集成到visual studio中,因此我使用EdmGen工具从现有数据库生成接口代码。

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

SSDL:

<Schema Namespace="Test.Store" Alias="Self" Provider="Npgsql" ProviderManifestToken="9.2.4" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
  <Function Name="TestFunc" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="public" />
</Schema>

CSDL:

<Schema Namespace="Test" Alias="Self" p1:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:p1="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
  <EntityContainer Name="TestContext" p1:LazyLoadingEnabled="true">
    <FunctionImport Name="TestFunc" IsComposable="false" />
  </EntityContainer>
</Schema>

MSL:

<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>

EdmGen生成的代码如下所示:

public int TestFunc()
{
    return base.ExecuteFunction("TestContext.TestFunc");
}

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

using (var ctx = new TestContext())
{
    ctx.TestFunc();
}

但我得到以下例外:

  

[System.Data.EntityCommandCompilationException]
  准备命令定义时发生错误。有关详细信息,请参阅内部异常。

内部例外是:

  

[System.ArgumentException]
  价值不在预期范围内。

我不知道此异常的来源,因为没有值传递给存储过程或从存储过程传递。也许你们可以帮助我。

可能也很重要的要点:

  • 这是我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
  • 我是Entity Framework和ADO.NET的新手,我对C#,.NET和Visual Studio也很陌生。所以我可能误解了一些概念。

0 个答案:

没有答案