Как использовать хранимую процедуру в ADO.NET Entity Framework - PullRequest
6 голосов
/ 21 июня 2009

у меня 3 таблицы; Я пишу хранимую процедуру в ADO.NET Entity Framework.

ALTER PROCEDURE [dbo].[sp_GetDepartmanData]
(@departman nvarchar(50))
BEGIN
  SELECT  
    d.ID, d.Name as DepartmanName,  
    sb.Salary, sb.email,
    sp.Name, sp.SurName, sp.Phone, sp.Married, sp.Address
  FROM         
    Departman d 
  INNER JOIN StaffsBusiness sb ON d.ID = sb.StaffsPersonelDepartmanID
  INNER JOIN StaffsPersonel sp ON sb.StaffsPersonelID = sp.ID 
  WHERE
    d.Name = @departman
END

Мне нужна функция хранимой процедуры, которую я пишу ниже:

var staffPersonel = staffContext.GetPersonelInformationWithDepartmanID("Yazılım");

gvPersonel.DataSource = staffPersonel;
gvPersonel.DataBind();

Функция GetPersonelInformationWithDepartmanID Я пишу из SQL (пользовательская функция в ADO.NET Entity Framework), есть 3 альтернативы (это глупо !!!), но у меня есть 3 таблицы соединения !!!. Как я могу использовать, если я присоединяюсь к 3 столам раньше?

Ответы [ 3 ]

6 голосов
/ 21 июня 2009

Хорошо, вам нужно сделать несколько шагов:

  • добавьте вашу хранимую процедуру sp_GetDepartmanData в модель Entity Framework (кроме того, настоятельно рекомендуется НЕ для вызова хранимых процедур sp_(something) - использование префикса sp_ зарезервировано только для системных хранимых процедур Microsoft)
  • поскольку ваша хранимая процедура возвращает набор данных, вам необходимо сначала создать концептуальную сущность для нее, прежде чем вы сможете использовать свой хранимый процесс; в Entity Designer создайте новый объект и назовите его некоторым полезным именем, например DepartmentDataEntityType или чем-то еще; добавить все поля, возвращаемые из хранимой процедуры, к этому типу сущности
  • Теперь вы можете создать импорт своей функции в модели данных объекта - перейдите в браузер модели, в разделе «model.store» перейдите к хранимой процедуре и щелкните правой кнопкой мыши «Create import import»
  • теперь вы можете дать своей функции в контексте объекта имя и определить, что она возвращает - в этом случае выберите вновь созданный тип сущности (например, DepartmentDataEntityType сверху)
  • все готово!

Теперь у вас должна быть функция import что-то вроде:

public global::System.Data.Objects.ObjectResult<DepartmentDataEntityType> GetPersonelInformationWithDepartmanID(global::System.String departmentName)
{
    global::System.Data.Objects.ObjectParameter departmentNameParameter;

    departmentNameParameter = new global::System.Data.Objects.ObjectParameter("departmentNameParameter", departmentName);

    return base.ExecuteFunction<DepartmentDataEntityType>("sp_GetDepartmanData", departmentNameParameter);
}

Эта функция в контексте вашего объекта теперь может быть вызвана для извлечения данных через хранимую процедуру из вашей базы данных.

Марк

Edit:

Если после этого вы получаете ошибку сопоставления («Ошибка 3027: сопоставление не указано для следующего EntitySet / AssociationSet»), то это потому, что созданный вами объект не сопоставлен ни с чем и используется только при импорте функции заполняет коллекцию этих лиц. Вам либо нужно как-то сопоставить эту сущность с хранилищем данных, либо изменить ее на сложный тип.

Чтобы создать сложный тип, просто откройте конструктор EF и щелкните правой кнопкой мыши пустую область. Перейти к Добавить> Комплексный тип. Вы должны увидеть новый сложный тип в браузере модели. Щелкните правой кнопкой мыши по нему и добавьте скалярные свойства, аналогичные тому, как вы добавили свойства к своей сущности. Затем удалите свою сущность и переименуйте ваш сложный тип так же, как сущность.

Это все, что вам нужно сделать:)

1 голос
/ 12 августа 2009

Как вы создаете эту «концептуальную сущность»? Если я создаю сущность, которая не сопоставлена ​​с I, я получаю следующую ошибку: «Тип сущности« foobar »не сопоставляется с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...