Entity Framework и PostgreSQL: исключение при вызове хранимой процедуры

Я пытаюсь связать свою базу данных PostgreSQL с помощью структуры сущностей Microsoft.

Поскольку поставщик базы данных 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 для рабочего стола 2012
    • npgsql 2.0.11.0
  • Я совершенно новичок в Entity Framework и ADO.NET, а также довольно плохо знаком с C#, .NET и Visual Studio. Так что я мог неправильно понять некоторые понятия.

0 ответов

Другие вопросы по тегам