Как создать сложный тип вручную в реализации POCO Entity Framework

#c# #entity-framework

#c# #entity-framework

Вопрос:

Я использую entity Framework, однако отключил генерацию кода и использую свои собственные классы poco (как подробно описано здесь http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx). До сих пор это было нормально, добавляя сущности, чтобы предоставлять кучу таблиц для запросов, однако пришло время, когда я хочу предоставить хранимую процедуру. Это не так просто — как мне написать создать сложный тип самостоятельно, а затем подключить его к модели сущности?

Я импортирую функциональную ссылку в edmx, я могу установить сложный возвращаемый тип и даже нажать «сгенерировать», но это непригодно, потому что я не использую автоматическую генерацию кода. Поэтому мне нужно иметь возможность создавать свои собственные, которые затем появятся в этом списке, чтобы я мог выбрать, а затем иметь возможность создать соответствующую запись в моем классе контекста сущности. Единственная информация в Интернете, похоже, генерирует сложные классы через визуальный интерфейс. Я неохотно редактирую файл edmx вручную, поскольку он будет удален только в том случае, если он будет сгенерирован повторно.

Я до сих пор пытался;

  • Добавление функции в мой класс контекста без помещения ее в edmx; это, очевидно, привело к недопустимому исключению операции «Не удалось найти FunctionImport ‘GetT4OpenCases’ в контейнере’EclipseEntities'».
  • Добавление функции в edmx и установка возвращаемого типа на none, затем добавление моей функции в контекст с помощью моего сложного типа, закодированного вручную, где я вижу другое недопустимое исключение operatino «Хранимая процедура или функция ‘GetT4OpenCases’ не имеет возвращаемого типа. ExecuteFunction поддерживает только хранимые процедуры и функции, которые имеют возвращаемый тип. «

Я в недоумении!

Спасибо.

Комментарии:

1. У меня есть далеко не идеальная работа, где у меня просто есть отдельный контекст, в котором хранятся сохраненные процедуры, которые имеют автоматическую генерацию кода, но это полный взлом; Я с нетерпением жду, знает ли кто-нибудь, как это сделать правильно…

2. Хорошо — оказывается, что обходной путь не работает — по какой-то причине наличие другого контекста нарушает мой исходный контекст, заставляя его постоянно жаловаться на отсутствие метаданных!! Итак, теперь я полностью застрял..

Ответ №1:

Хорошо, оказывается, это довольно просто — в файле edmx

  • Обновите модель данных, чтобы включить сохраненный процесс, который я хочу
  • Создайте функциональный импорт
  • Во всплывающем окне выберите Создать сложный тип
  • Создайте новый класс, который соответствует тому же имени / имеет те же свойства, что и предлагаемый сложный тип
  • Добавьте запись в свой класс контекста вручную, например;

    общедоступный IEnumerable GetT4Brokers() { возвращает базу.ExecuteFunction(«GetT4Brokers»); }