Я нахожусь в процессе сборки сценарий для довольно большого проекта. Один из проектов требует, чтобы Модель Платформы Объекта была скомпилирована в библиотеку. Из-за пути сервер сборки работает, все сборки ручной работы для управления различными сценариями развертывания, не влияя на разработчиков и файлы проекта.
Там должен так или иначе генерировать Модель EF с помощью задачи MSBuild, не используя файл проекта, сгенерированный Visual Studio? В настоящее время фактические компиляции блока с помощью задачи CSC, однако фактическое развертываемое приложение перестало работать, потому что Модель EF не включена в скомпилированный блок.
Какие-либо указатели, в которые Цели или Задачи Сборки могут использоваться, чтобы генерировать модель и создать необходимые ресурсы для встраивания в блок?
Пожалуйста, примите во внимание
Компиляции проекта, прекрасные в Visual Studio, однако с помощью файла проекта на сервере сборки, не являются опцией, поскольку существуют различные изменения, который должен быть сделан к проекту во время развертывания, и этим управляют через сделанный на заказ сценарий за пределами управления групп разработчиков. Это работало успешно на несколько проектов, однако Модель EF вызывает некоторые головные боли в этом определенном сценарии.
Обновление
Текущее решение не идеально, но работы. Файл Проекта был изменен для копирования Образцовых ресурсов EF в папку в проекте на новой сборке конечных версий, которая затем проверяется в управление исходным кодом. Когда сценарий сборки работает на сервере, модели EF встраиваются в блок. Это, кажется, осуществимое обходное решение в настоящий момент.
Я действительно имел дело с этим сегодня, поскольку исходное дерево моего проекта неправильно настроено для выполнения задачи сборки Entity Framework, которая генерирует и внедряет ресурсы в выходную dll.
Я исследовал следующие варианты:
Использование задачи msbuild EntityDeploy
Если вы откроете файл .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 задачи сборки в отражателе и посмотреть, что она делает.
Надеюсь, это поможет.
Да, есть командная утилита, называемая Edmgen
, которая может сделать это. Используйте Edmgen /?
для возможных коммутаторов.