Использовать MSBuild для построения Entity Framework Model без использования файла проекта? - PullRequest
5 голосов
/ 31 января 2010

Я нахожусь в процессе создания сценария для довольно большого проекта. Один из проектов требует, чтобы Entity Framework Model была скомпилирована в библиотеку. Благодаря тому, как работает сервер сборки, все сборки создаются вручную для управления различными сценариями развертывания, не затрагивая разработчиков и файлы проекта.

Есть ли способ сгенерировать модель EF, используя задачу MSBuild, без использования файла проекта, сгенерированного Visual Studio? В настоящее время фактическая сборка компилируется с использованием задачи CSC, однако фактическое развернутое приложение завершается сбоем, поскольку модель EF не включена в скомпилированную сборку.

Какие-либо указатели, в которых можно использовать цели или задачи сборки для создания модели и создания необходимых ресурсов для встраивания в сборку?

Обратите внимание

Проект прекрасно компилируется в Visual Studio, однако использование файла проекта на сервере компоновки не вариант, так как существуют различные изменения, которые необходимо внести в проект во время развертывания, и это контролируется посредством пользовательской сборки. сценарий вне контроля команд разработчиков. Это успешно сработало для нескольких проектов, однако модель EF вызывает некоторые головные боли в этом конкретном сценарии.

Обновление

Текущее решение не идеально, но работает. Файл проекта был изменен для копирования ресурсов модели EF в папку в проекте в новой версии сборки, которая затем проверяется в системе контроля версий. Когда скрипт сборки выполняется на сервере, модели EF внедряются в сборку. Кажется, на данный момент это обходной путь.

Ответы [ 2 ]

4 голосов
/ 03 февраля 2010

Я действительно имел дело с этим сегодня, поскольку исходное дерево моего проекта не настроено должным образом для запуска задачи сборки Entity Framework, которая генерирует и встраивает ресурсы в выходную dll.

Я исследовал следующие варианты:

Использование задачи EntityDeploy msbuild

Если вы откроете файл .csproj в блокноте, вы должны увидеть немного XML, например

 <EntityDeploy Include="MyEntities.edmx">
  <Generator>EntityModelCodeGenerator</Generator>
  <LastGenOutput>MyEntities.Designer.cs</LastGenOutput>
 </EntityDeploy>

Это задача msbuild, которая использует Microsoft.Data.Entities.Build.targets и Microsoft.Data.Entities.Build.dll для чтения файла edmx, сгенерируйте ssdl , CSDL и MSL файлы, а затем вставьте их в целевой DLL. (Эти файлы можно найти в C: \ Windows \ Microsoft.NET \ Framework \ v3.5 ).

Использование EdmGen

Как указал Крейг, вы можете использовать EdmGen.exe , который поставляется вместе с фреймворком. Я попробовал, но я немного настроил данные в моем файле edmx, и EdmGen.exe, похоже, действительно хочет выполнить первоначальное генерирование из исходной базы данных.

Использование EdmGen2

EdmGen2.exe - проект с открытым исходным кодом, который делает немного больше, чем EdmGen. Я использовал его для генерации файлов ssdl, csdl и msl. Вы можете просто указать его на свой файл edmx, и он сгенерирует необходимые файлы ssdl, csdl и msl. Затем я включил их вместе с моей DLL и изменил строку подключения с

connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;

до

connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl;

Примечание. Я говорю платформе Entity, что эти файлы находятся в том же каталоге, что и моя dll, а не как ресурсы.

Все три из них, задача сборки EdmGen и EdmGen2, представляют собой тонкие оболочки, которые вызывают System.Data.Entity.dll для всех сложных вещей. В крайнем случае вы можете посмотреть на dll задачи сборки в отражателе и посмотреть, что он делает.

Надеюсь, это поможет.

1 голос
/ 01 февраля 2010

Да, есть утилита командной строки с именем EdmGen, которая может сделать это. Используйте EdmGen /? для возможных переключателей.

...