Выполнение необработанного запроса с использованием entity framework
Как я могу выполнить необработанный запрос в моем API, используя модель рабочих данных entity frame. Я смог получить данные через Linq, но теперь мне нужны некоторые конкретные данные, из-за которых я выполняю необработанный запрос.
Когда я запускаю приведенный ниже код, я получаю исключение
"Операция не может быть завершена, потому что DbContext был удален."
Я действительно понимаю исключение n, когда я гуглю его, он говорит мне проверить соединение, может быть, там какая-то скобка неуместна, но я не знаю, где именно.
Кроме того, если это правильный способ выполнения необработанного запроса в c# MVC с использованием entity framework, то я что-то упускаю?
Что я уже пробовал:
public HttpResponseMessage Get(int EmployeeId) { var masterInfo = entities.Empmasters.where(e => e.EmployeeId == EmployeeId).FirstOrDefault(); var emppersonal = entities.EmpMaster.Where(p => p.EmployeeID == masterInfo.EmployeeID).FirstOrDefault(); int value = empersonal.Gender; var Gender = entities.LookUps.SqlQuery(" SELECT LookUpName FROM LookUp WHERE LookUpType = 'GENDER' AND LookUpValue = @value ", new sqlParameter(" @value" , value)); if (masterInfo == null) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "No info"); } else { return Request.CreateResponse(HttpStatusCode.OK, new {masterInfo, empPersonal Gender = gender}); }
F-ES Sitecore
Сообщение об ошибке относительно ясно, проблема заключается в том, что вы используете dbcontext, у которого был вызван метод dispose, поэтому, если "сущности" - это ваш dbcontext, то посмотрите на свой другой код, чтобы увидеть, мог ли он быть удален между тем, когда он был создан, и когда ваша функция выполняется. В общем, это плохая идея иметь такой код в любом случае, если ваш HttpResponseMessage нуждается в контексте БД, он должен создать его сам, ваш код имеет предположения, которые заставляют его действовать неожиданно.
Mike V Baker
Я не понимаю, почему к поискам относятся иначе, чем к Эмпмастерам или Эмпмастерам.
int value = empersonal.Пол;
var temp = enitites.поиски.Где(Р =&ГТ; п.LookUpType=='пол' &амп;&амп; С. LookUpValue==значение);
var Gender = temp.LookupName;
Tausif Khan
Да, мы могли бы сделать это таким образом, что мы и сделали. Но я хотел получить его через сырой запрос. Там будут наши сценарии, где я буду выполнять необработанный запрос позже в проекте. Пожалуйста, если вы можете помочь мне в выполнении того же самого с помощью необработанного запроса? Это будет очень полезно.
Mike V Baker
Необработанные запросы открыты для атак SQL-инъекций, поэтому я стараюсь избегать их, как чумы. Обычно я создаю либо представление, либо хранимую процедуру и импортирую ее в свою модель данных EF.
В прошлом (давным-давно) Я использовал уровень доступа к данным .NET, который не использовал EF, и у него была поддержка необработанных запросов. Дай подумать... это было в 2008 году... По-моему, я использовал статьи Дэвида Винемана.
общедоступный статический набор данных GetDataSet(string sqlQuery)
{
DataSet dataSet = новый набор данных();
Объект sqlconnection соед = вызов getconnection();
Команда sqlcommand cmd в;
if (conn != null)
{
используя (шт.)
{
cmd = conn.CreateCommand();
УМК.Свойства commandtext = SQL-запрос;
SqlDataAdapter dataAdapter = новый SqlDataAdapter(cmd);
объект DataAdapter.Заливка(набор данных);
}
УМК.Располагать();
Коннектикут.Закрывать();
Коннектикут.Располагать();
}
// возврат набора данных
возвращаемый набор данных;
}
Я не знаю, хотите ли вы принести еще одну библиотеку. Возможно, ваше приложение уже использует SqlDataAdapter, поэтому другая ссылка lib может и не понадобиться.
Richard Deeming
Кроме того, что они нет откройте SQLi, если вы используете параметры, как это сделал OP. :)
Mike V Baker
Ой. - Вы правы. Извини, я думал о другом разговоре.
Richard Deeming
Похоже, что это может быть ленивая загрузка-что - то пытается загрузить свойство навигации из одной из ваших сущностей после того, как контекст был удален.
Mike V Baker
@OP - вы хотите сказать, что первые два вызова базы данных работают, но третий, который использует параметризованный запрос, не работает? Если это так, то я не знаю, почему он будет жаловаться на то, что контекст удален. Если он терпит неудачу на всех трех, потому что вы запускаете это вне обычного процесса, то использование локально созданного dbcontext будет ответом.
У меня действительно есть вопрос о последней части запроса - и LookUpValue = @value - какой тип LookUpValue, текст? Может быть, стоит и LookUpValue = '@value' ??