Я использую Entity Framework Core 3, чтобы попытаться выполнить хранимую процедуру. Мне нужно получить возвращаемое значение хранимой процедуры, однако в хранимой процедуре нет имени. Вот мой код для выполнения моей хранимой процедуры:

var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25}", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();

Вот мой класс ArfmCreateEditRequestDto:

public class ArfmCreateEditRequestDto
{
    [Column(Order = 0)]
    public string Retval { get; set; }
}

Когда я выполняю это на SQL Server, я получаю следующие результаты:

--------------------------------------
| (No column name)                   |
--------------------------------------
| RequestID: 36 Succesfully Added    |
--------------------------------------

Когда я запускаю свою программу, я получаю исключение, в котором говорится

"System.InvalidOperationException: The required column 'Retval' was not present in the results of a 'FromSql' operation."

Если я изменю это на это:

    [Column("", Order = 0)]
    public string Retval { get; set; }

Тогда я получаю это исключение:

"System.ArgumentException: The argument 'name' cannot be null, empty or contain only whitespace. (Parameter 'name')"

Я действительно думал, что первое сработает, и Entity Framework просто сопоставит данные из позиции заказа 0 с моим свойством, но, видимо, этого не произошло.

Итак, мой вопрос: как зафиксировать возвращаемое значение, если столбец не имеет имени в хранимой процедуре? Обратите внимание: я вообще не могу изменить хранимую процедуру.

2
Icemanind 12 Фев 2021 в 22:29

1 ответ

Лучший ответ

Это невозможно. есть некоторые ограничения в использовании FromSqlRaw

1-Запрос SQL должен возвращать данные для всех свойств типа сущности.

2-Имена столбцов в наборе результатов должны совпадать с именами столбцов, которым сопоставлены свойства. Обратите внимание, что это поведение отличается от EF6. EF6 игнорирует свойство для сопоставления столбцов для необработанных запросов SQL, а имена столбцов набора результатов должны совпадать с именами свойств

На основе этой ссылки: https://docs.microsoft.com / en-us / ef / core / querying / raw-sql

Но я думаю, что вы можете обернуть процедуру хранения и вставить результат в временную таблицу с произвольным столбцом следующим образом:

var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"create table #tmp( Retval nvarchar(128) ) insert into #tmp( Retval ) exec ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25} select Retval from #tmp", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();
1
Saeed Esmaeelinejad 12 Фев 2021 в 20:58