Member 11331145 Ответов: 1

Не удается решить исключение времени выполнения с помощью entity framework


Hello everyone,

I am working on a project that uses EF to do crud operations against the database I'm working with. I created several stored procedures to do the insert, update and delete operations because I am doing two things, I'm adding a record to an audit table and i'm performing the crud operation itself.

My problem is that during execution of the code I get a run time exception that I haven't found an answer for online.  The Error occurs inside the Context class generated by EF.

<pre>return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<DeleteEDeliveryScheduledEvent_Result>("DeleteEDeliveryScheduledEvent", eventIdParameter, modifiedByParameter);


Ошибка заключается в следующем:
Цитата:
Системы.Данных.Лица.Ядро.EntityCommandExecutionException
Значение HRESULT=0x8013193C
Message=средство чтения данных несовместимо с указанной моделью AgentPortalModel.DeleteEDeliveryScheduledEvent_Result'. Член типа "ErrorNumber" не имеет соответствующего столбца в считывателе данных с тем же именем.


моя стандартная хранимая процедура удаления имеет следующую структуру:

CREATE PROCEDURE [dbo].[DeleteEDeliveryScheduledEvent]
           @EventId INT = NULL,
           @ModifiedBy int
            
        AS 
           
       SET NOCOUNT ON; 
                
        IF @EventId IS NOT NULL

     BEGIN TRANSACTION
     BEGIN TRY
                
    INSERT INTO EDeliveryAudit
           (TableName, 
           ActionId, 
           RowXml, 
           ModifiedBy, 
           ModifiedDate)
    VALUES ('EDeliveryScheduledEvents',
           3, 
           (SELECT EventId,
                   EventDateTime
              FROM EDeliveryScheduledEvents
             WHERE EventId = @EventId
               FOR XML RAW ('ScheduledEvent'), ROOT ('ScheduledEvents'), ELEMENTS ), 
           @ModifiedBy, 
           GETDATE())

    DELETE FROM EDeliveryScheduledEvents
     WHERE EventId = @EventId
            
       END TRY
     BEGIN CATCH
           
    SELECT ERROR_NUMBER() AS ErrorNumber,
           ERROR_SEVERITY() AS ErrorSeverity,
           ERROR_STATE() AS ErrorState,
           ERROR_PROCEDURE() AS ErrorProcedure,
           ERROR_LINE() AS ErrorLine,
           ERROR_MESSAGE() AS ErrorMessage;
           
        IF @@TRANCOUNT > 0
  ROLLBACK TRANSACTION       
       
       END CATCH
           
        IF @@TRANCOUNT > 0
    COMMIT TRANSACTION


Что я уже пробовал:

Я попытался с помощью параметров.
Я пробовал использовать ObjectContext для прямого вызова функции EF

Bryian Tan

ошибка заключается в том, что "ErrorNumber" не является свойством объекта DeleteEDeliveryScheduledEvent_Result / table / entity. Вы это подтвердили?

Member 11331145

ErrorNumber не является частью моей таблицы и не должен быть частью выходных данных. единственная часть, где у меня есть ErrorNumber, находится внутри хранимой процедуры в предложении catch, где я откатываю транзакцию, если возникает ошибка.

1 Ответов

Рейтинг:
0

Member 11331145

Разгадал ее!

Я не могу сказать, что понимаю почему, но Entity Framework видела оператор Select внутри catch и настраивала сложные типы, чтобы ожидать эти столбцы как часть выходных данных (ERROR_NUMBER, ERROR_SEVERITY и т. д.). хранимые процедуры выполнялись без ошибок и возвращали либо новое удостоверение, либо бит, указывающий на успех или неудачу, а EF жаловался на отсутствующие столбцы.

Я удалил оператор select из всех хранимых процедур, а также удалил все возвращаемые значения, которые я закодировал в sp. (Некоторые таблицы не имеют поля идентификации, и поэтому я возвращал 1 или 0).

Я не уверен, как это повлияет на Оператор Catch в хранимой процедуре, но теперь код работает без сбоев.