Можно ли вызвать хранимую процедуру в таблице Table-Per-Hierarchy в EF Core 3.1? - PullRequest
1 голос
/ 07 апреля 2020

Я перехожу с EF Core 2.2 на 3.1. Одно критическое изменение (# 15392) состояло в том, что оно больше не состоит из хранимых процедур, поэтому вам пришлось добавить «AsEnumerable». Обычно это работает, но у меня есть вызов хранимой процедуры в таблице TPH, где это не удается:

  1. Мой вызов SPRO C:

     SqlParameter authorizedUserID_p = 
              new SqlParameter("@authorizedUserID", authorizedUser.ID);
     IEnumerable<Post> query = 
              context.Posts.FromSqlRaw<Post>("Post.USP_ReadPost @ID, @AuthorizedUserID",
                parameters: new[]{ parentID_p, authorizedUserID_p }
            ).AsEnumerable<Post>();
     Post targetPost = query.ToList<Post>().FirstOrDefault<Post>();
    
  2. И он выдает эту ошибку, рекомендуя использовать AsEnumberable (который я уже использую выше):

    System.InvalidOperationException: FromSqlRaw или FromSqlInterpolated вызывается с несложным SQL и с составление запроса по нему. Рассмотрите возможность вызова AsEnumerable после метода FromSqlRaw или FromSqlInterpolated для выполнения композиции на стороне клиента.

  3. Я считаю, что причина в том, что моя таблица Posts является Table-per-hiearchy, как и другие звонки в SPROCS в том же приложении работают нормально. Буду признателен за любую возможную помощь!

1 Ответ

1 голос
/ 07 апреля 2020

Это еще одна проблема, представленная EF C 3, отслеживаемая # 18232: невозможно использовать хранимые процедуры, связанные с сущностями, которые наследуют другую .

Причина в том, что Вызовы SP не являются составными, и EF Core всегда пытается составить SQL для базовых объектов TPH, чтобы добавить условие дискриминатора. Подобно глобальным фильтрам запросов, но там вы можете по крайней мере использовать IgnoreQueryFilters, тогда как здесь у вас нет выбора.

Хорошая новость заключается в том, что это уже исправлено в репозитории EF C. Плохая новость заключается в том, что он не будет выпущен до EF C 5.0.

Поскольку AsEnumerable() не помогает, все, что вы можете сделать, - это ждать EF C 5.0. Или, если возможно, конвертируйте такие SP в TVF (табличные функции), которые можно компоновать. В общем, используйте скалярные функции или хранимые процедуры с выходным параметром (ами) для вызовов, не возвращающих запрос (для выполнения с ExecuteSql*), и табличные функции для вызовов, возвращающих один запрос (для использования с FromSql*). Обратите внимание, что в настоящее время EF C в любом случае не поддерживает множественные запросы, возвращающие хранимые процедуры.

...