Подтвердить что ты не робот

Отображение результатов хранимой процедуры Entity Framework

Я искал аналогичную тему для моего вопроса в Интернете за последние несколько дней. Я, наконец, прибег к самому заданию этого вопроса.

Используя методологию кода и EF 4.3.1, я создал класс контекста, классы сущностей и классы для хранения вывода хранимой процедуры. Класс контекста имеет методы, которые выполняют определенные хранимые процедуры с помощью SqlQuery<T>.

Пример:

public IEnumerable<Results> GetData(int id)
{
   var parameters = new SqlParameter[] { new SqlParameter("@id", id) };
   var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id",    parameters);
   var data= result.ToList<Result>();

   return data;
}

Как я отслеживаю свою отладку, мои данные возвращаются, а данные сопоставляются свойствам с соответствующим именем. Однако на выходе есть столбец с "/" в имени (пример: Info/Data). Очевидно, я не могу назвать такое свойство, поэтому я решил, что могу отобразить вывод с использованием атрибута column ([Column("Info/Data")]):

[Column("Info/Data")]
public string InfoData
{
   get { return infoData; }
   set { infoData= value; }
}

Я даже попытался использовать оператор verbatim ([Column(@"Info/Data")]), обернув текст [] ([Column("[Info/Data]")]), и я попробовал оба ([Column(@"[Info/Data]")]). При переходе по коду я вижу, что свойства с соответствующими именами столбцов назначены, но свойства с атрибутом столбца игнорируются и переходят во время назначения.

Я также попробовал fluent-api для каждого столбца для объекта.

    modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data");

но это вызывает следующее исключение:

Считыватель данных несовместим с указанным "NameSpace.Result". Элемент типа "InfoData" не имеет соответствующего столбца в устройстве чтения данных с тем же именем.

В моем проекте NameSpace.Result есть класс (имя изменено для безопасности), а InfoDatais - это свойство, которое я пытаюсь сопоставить с помощью fluent-api (соответствующий столбец sql имеет a/in; ex: Info/Data).

Кто-нибудь сталкивался с этой проблемой?

Если моя проблема неясна или ее попросили, пожалуйста, дайте мне знать.

4b9b3361

Ответ 1

Я понимаю, что это старый вопрос сейчас, но поскольку он был подхвачен последним ответом OPs, возможно, он все еще заинтересован в этом.

Если вы застряли в этом сохраненном proc as-is и возвращаете имена столбцов, несовместимые с EF, видя, как вы проходите в SQL, чтобы вызвать proc direct с помощью SqlQuery, можете ли вы использовать метод INSERT-EXEC чтобы сделать что-то вроде объявления переменной таблицы (с более совместимыми именами столбцов), INSERT-EXEC хранит proc в переменной таблицы, а затем выберите из переменной таблицы как ваш результирующий набор?

Это был бы длинный SQL-код, чтобы пройти, и поэтому я не был приемлемым решением, но, как мысленное упражнение, чтобы проверить, насколько это связано с проблемой, я думал, что предлагаю ее.

Хорошая статья здесь по этой проблеме: http://www.sommarskog.se/share_data.html - большинство методов не помогают, поскольку вы не можете изменить свой (и, следовательно, по-видимому, практически не имеют доступа к структуре db или вообще не вносят в нее изменения?), но метод INSERT-EXEC появляется как возможное обходное решение без необходимости ничего менять на уровне db...

Ответ 2

Невозможно сделать то, что вы хотите. При использовании Raw SQL часть отображения EF исключается.

Как использовать Entity Framework для сопоставления результатов хранимой процедуры с объектом с иными параметрами

То же самое с ExecuteStoreQuery http://social.msdn.microsoft.com/Forums/pl/adonetefx/thread/d524b005-12a4-4300-a974-1e0582de876b

Вы можете использовать ObjectQuery для получения списка объектов DbDataRecord. Затем используйте функцию Linq "Выбрать" для сопоставления результатов с типом вашего объекта. Если вы переносите это сопоставление в функцию расширения, которая принимает IEnumerable и возвращает IEnumberable.

Возвращает пользовательский объект < List T > из структуры Entity и присвоить объекту Data Data Source

Ответ 3

Возвращаясь назад и думая об этой проблеме, одним из самых простых (потенциально не чистых или лучших решений) является обертывание всего набора результатов в новой процедуре. Конечно, если у вас есть возможность изменить процедуру, не нарушая ничего, что наилучшим решением. Однако, если вы не можете изменить выход, одно решение - использовать OPENROWSET (посмотрите на ответ Аарона), чтобы захватить вывод процедуры в таблицу и выбрать каждый столбец с помощью новый псевдоним, который работает и придерживается более чистых принципов программирования.

Я надеюсь, что это поможет любому в будущем.

Примечание:
Я не проверял, разрешила ли новая версия EF эту проблему.