У меня 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 столам раньше?
Хорошо, вам нужно сделать несколько шагов здесь:
sp_GetDepartmanData
в вашу модель Entity Framework (кроме этого - настоятельно рекомендуем НЕ вызывать ваши хранимые процедуры sp_(something)
- использование префикса sp_
зарезервировано для системных хранимых процедур только для Microsoft) DepartmentDataEntityType
или чем-то еще; добавить все поля, возвращаемые из хранимой процедуры, к этому типу объекта 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);
}
Эта функция в контексте вашего объекта теперь может быть вызвана для извлечения данных через хранимую процедуру из вашей базы данных.
Марк
Редактировать:
Если после этого вы получаете ошибку сопоставления («Ошибка 3027: сопоставление не указано для следующего EntitySet / AssociationSet»), то это потому, что созданный вами объект не сопоставлен ни с чем и используется только тогда, когда функция import заполняет коллекцию из этих лиц. Вам либо нужно каким-то образом сопоставить эту сущность с хранилищем данных, либо изменить ее на сложный тип.
Чтобы создать сложный тип, просто откройте конструктор EF и щелкните правой кнопкой мыши пустую область. Перейти к Добавить> Комплексный тип. Вы должны увидеть новый сложный тип в браузере модели. Щелкните правой кнопкой мыши по нему и добавьте скалярные свойства, аналогичные тому, как вы добавили свойства к своей сущности. Затем удалите вашу сущность и переименуйте ваш сложный тип так же, как сущность.
Это все, что вам нужно сделать :)
Как вы создаете эту «концептуальную сущность»? Если я создаю сущность, которая не сопоставлена с, я получаю следующую ошибку: «Тип сущности« foobar »не сопоставляется с базой данных.