Неверное приведение после вызова хранимой процедуры через Entity Framework - PullRequest
0 голосов
/ 27 марта 2019

Я создал следующую хранимую процедуру в Oracle 12.2:

create or replace PROCEDURE "SP_VARIABELEN_HIERARCHY" (
PP_USER_IN      IN  VARCHAR2,
    PCPID_IN        IN  VARCHAR2,
    VAR_CODE_IN     IN  VARCHAR2,
    FASE_NR_IN      IN  NUMBER,
    P_RESULTS       OUT SYS_REFCURSOR
    ) IS
    BEGIN

OPEN P_RESULTS FOR
    SELECT  DISTINCT        LEVEL
                            VAR_CODE,
                            FASE_NR,
                            GENSTAT_VOLG_NR
    FROM                    EP3_VARIABELEN_FS2_HULP
    WHERE PP_USER           = PP_USER_IN
    AND CODE                = PCPID_IN
    CONNECT BY PRIOR AFG    = VAR
    AND PP_USER             = PP_USER_IN
    AND CODE                = PCPID_IN
    START WITH VAR_CODE     = VAR_CODE_IN
    AND FASE_NR             = FASE_NR_IN
    AND PP_USER             = PP_USER_IN
    AND CODE                = PCPID_IN
    ORDER BY LEVEL DESC, GENSTAT_VOLG_NR;
    END SP_VARIABELEN_HIERARCHY;

Я настроил хранимую процедуру в App.config так:

  <oracle.manageddataaccess.client>
    <version number="*">
      <implicitRefCursor>
        <storedProcedure schema="EPROS" name="SP_VARIABELEN_HIERARCHY">
          <refCursor name="P_RESULTS">
            <bindInfo mode="Output" />
            <metadata columnOrdinal="0" columnName="VAR_CODE" providerType="Varchar2" dataType="System.String" allowDBNull="true" nativeDataType="Varchar2" columnSize="10" />
            <metadata columnOrdinal="1" columnName="FASE_NR" providerType="Int64" dataType="System.Int64" allowDBNull="true" nativeDataType="Number" columnSize="12" />
            <metadata columnOrdinal="2" columnName="GENSTAT_VOLG_NR" providerType="Int64" dataType="System.Int64" allowDBNull="true" nativeDataType="Number" columnSize="12" />
          </refCursor>
        </storedProcedure>

Я импортировал SP в Entity Framework и создал функцию импорта со сложным типом, сгенерированным из данных в App.config.

Я написал следующий юнит-тест:

using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Wur.Epros.Core.Infrastructure;
using Wur.Epros.Core.Repositories;
using Wur.Epros.Core.Tests.Base;

namespace Wur.Epros.Core.Tests.Repositories
{
    [TestClass]
    public class Ep3VariabelenFs2HulpRepositoryTests : TestBase
    {
        [TestMethod]
        public void RekenregelsTest()
        {
            using (var dbContext = EprosEntities)
            {
                dbContext.Database.BeginTransaction();
                string cUSER = "VISSCHER";
                string cPCPID = "D0600513_1072";
                string cVAR_CODE = "DOPJ2";
                int cFASE_NR = 2;


                string sSQL = string.Empty;
                //var result = Ep3VariabelenFs2HulpRepository.Instance.Get(v =>
                //    v.PP_USER == cUSER
                //    && cPCPID == cPCPID
                //    && )
                sSQL = "SELECT DISTINCT LEVEL";
                sSQL = sSQL + " , VAR_CODE";
                sSQL = sSQL + " , FASE_NR";
                sSQL = sSQL + " , GENSTAT_VOLG_NR";
                sSQL = sSQL + " FROM EP3_VARIABELEN_FS2_HULP";
                sSQL = sSQL + " WHERE PP_USER        = '" + cUSER + "'";
                sSQL = sSQL + " AND CODE             = '" + cPCPID + "'";
                sSQL = sSQL + " CONNECT BY PRIOR AFG =      VAR ";
                sSQL = sSQL + " AND PP_USER          = '" + cUSER + "'";
                sSQL = sSQL + " AND CODE             = '" + cPCPID + "'";
                sSQL = sSQL + " START WITH VAR_CODE  = '" + cVAR_CODE + "'";
                sSQL = sSQL + " AND FASE_NR          =  " + cFASE_NR;
                sSQL = sSQL + " AND PP_USER          = '" + cUSER + "'";
                sSQL = sSQL + " AND CODE             = '" + cPCPID + "'";
                sSQL = sSQL + " ORDER BY LEVEL DESC";
                sSQL = sSQL + "        , GENSTAT_VOLG_NR";

                var result1 = GetDataTable(dbContext, sSQL);

                var result2 = Ep3VariabelenFs2HulpRepository.Instance.GetEp3VariabelenHierarchy(cUSER, cPCPID, cVAR_CODE, cFASE_NR);

                var count1 = result1.Rows.Count;
                var count2 = result2.Count();

                Assert.AreEqual(count1, count2, "Count");
            }
        }
    }
}

Table description

Мы преобразуем использование строки SQL в LINQ с использованием Entity Framework.

Теперь каждый раз, когда я выполняю модульный тест, я получаю исключение InvalidCaseException. Я предполагаю, что конфигурация неверна, но я не могу указать на это.

Версия Entity Framework: 6 Версия Oracle 12.2

1 Ответ

0 голосов
/ 28 марта 2019

Дурачил себя здесь довольно плохо. Внимательно посмотрите на хранимую процедуру наверху. Запятая между LEVEL и VAR_CODE отсутствует, в результате чего VAR_CODE становится псевдонимом для LEVEL.

Что я не понимаю, почему было выброшено исключение InvalidCastException. Я пропустил УРОВЕНЬ в App.config для Сложного Типа, чтобы он все равно работал (давая неверный результат). Очень странно.

EDIT:

Оглядываясь назад, я понимаю, что происходит не так. Поле LEVEL - это NUMBER, а VAR_CODE - это VARCHAR2. Таким образом, псевдоним VAR_CODE выдает NUMBER, где ожидается VARCHAR2, следовательно, InvalidCastException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...