Как использовать хранимую процедуру в Платформе Объекта ADO.NET

Только что созданный вспомогательный класс для извлечения этого шаблона в другое место:

public class RxRethrow {
    public static <T, R> Func1<T, R> rethrow(Func1R<T, R> catchedFunc) {
        return t -> {
            try {
                return catchedFunc.call(t);
            } catch (Exception e) {
                throw Exceptions.propagate(e);
            }
        };
    }

    public interface Func1R<T, R> extends Function {
        R call(T t) throws Exception;
    }
}

Вы можете назвать его так:

.map(RxRethrow.rethrow(products -> mapper.writer(schema).writeValueAsString(products)))
6
задан Penguen 28 June 2009 в 18:09
поделиться

2 ответа

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

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

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

Marc

Edit:

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

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

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

6
ответ дан 17 December 2019 в 00:13
поделиться

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

1
ответ дан 17 December 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: