EF Core Дополнительная колонка, обработанная как требуется - PullRequest
1 голос
/ 16 марта 2019

Мне нужно прочитать результат из хранимой процедуры, вызванной из EF Core, которая включает в себя вещи, предназначенные для целей форматирования электронной таблицы, такие как строки с только нулевыми значениями.Мой код в основном работает, но есть два столбца, которые приводят к сбою запроса, когда я их включаю.

Вот мой класс модели (для краткости включены только несколько подпорок):

public class StoredProcRecord
{
    [Column("Prod Line")]
    public string ProductLine { get; set; }

    [Column("Current Sales")]
    public decimal? CurrentSales { get; set; }

    [Column("Current Margin $")]
    public decimal? CurrentMargin { get; set; }
}

Вот фрагмент части вывода, если я запускаю хранимую процедуру из SQL Server Management Studio:

Stored Proc Output

Вот как я зарегистрировал тип какмодель сущности с EF Core в контексте db:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Query<StoredProcRecord>();
}

Вот как я вызываю хранимую процедуру:

return _context.Query<StoredProcRecord>().FromSql("EXECUTE my_stored_proc").ToList();

В этом примере EF Core всегда выдает исключение при попыткепозвонить FromSql() с сообщением:

В результатах операции «FromSql» отсутствует обязательный столбец «Current Margin $».

Согласнодо EF Core docs , если столбец обнуляем, то это не требуется.Тем не менее, я получаю исключение, которое требует "Текущий марж $".Это также происходит только со свойством CurrentMargin, а не со свойством CurrentSales, которое использует тот же тип.Если я удаляю CurrentMargin, все работает нормально, и мне просто не хватает этого одного свойства.

Я попытался использовать [Column(Order = 2)] вместо именованного столбца, думая, что, возможно, знак доллара в имени столбцаимел к этому какое-то отношение, но это приводит к:

Требуемый столбец 'CurrentMargin' не присутствовал в результатах операции 'FromSql'.

Включаяи порядок, и имя приводят к одному и тому же типу ошибки.

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

Чем отличается CurrentMargin свойство по сравнению с CurrentSales, что приводит к его провалу, как это?Есть ли какой-то особый способ обработки знака доллара в названии столбца?Я что-то упустил полностью?

Редактировать:

Вот фрагмент из самого конца хранимой процедуры, где выводится полученная таблица.Я включил это, чтобы показать, что «Current Margin $» действительно является одним из имен столбцов.Я фактически скопировал / вставил прямо из хранимой процедуры, чтобы убедиться, что не набрал неверно имя столбца.

BEGIN
-- bulk of stored procedure that builds #tmp_tbl omitted for length
SELECT 
'Prod Line'          = pl_key,
'Current Sales'      = curr_sales,
'Current Margin $'   = curr_margin
FROM #tmp_tbl
END

1 Ответ

1 голос
/ 19 марта 2019

Смущающий ответ на этот вопрос - убедитесь, что вы внимательно прочитали свой код, особенно такие вещи, как строковые значения.

В этом случае у меня есть две хранимые процедуры, которые в конечном итоге будут использоваться моим приложением, bv_xls_profit_sum_v2 и bv_xls_prod_sum_v2.Я реализовывал использование результатов первой хранимой процедуры, но случайно передал имя второй хранимой процедуры в EF.Столбцы из этих двух не совпадают, поэтому полученная мною ошибка, связанная с отсутствием обязательного столбца, не касалась того, был ли столбец обнуляемым или нет, но на самом деле это был случай, когда столбец действительно отсутствовал в наборе результатов.Это не было очевидно при тестировании через SQL Server Management Studio, потому что я не осознавал, что выполняю другую хранимую процедуру.

Бонус "Ответ":

Priorчтобы выяснить мою глупую ошибку, я нашел обходной путь, который я оставлю здесь на всякий случай, если он окажется полезным для всех.Мое приложение имеет свой собственный экземпляр SQL Server, но также выполняет запросы к другому экземпляру SQL Server, который не контролируется приложением (именно там находятся хранимые процедуры, о которых идет речь).Чтобы обойти проблему, с которой я боролся, я подключил другой экземпляр SQL Server к моему в качестве связанного сервера.Затем я продублировал хранимую процедуру, которую хотел вызвать, обновил ее, чтобы она запрашивала связанный сервер, удаляла ненужные пустые строки и возвращалась, используя имена столбцов, соответствующие классу моей модели.Это работает и позволяет мне управлять хранимой процедурой, хотя, скорее всего, добавляет дополнительную задержку к получению набора результатов обратно при запросе измененной хранимой процедуры.

...