Необходимо сгенерировать файлы EDMX и скомпилировать их.

Мой вопрос может быть немного другим или базовым для опытных пользователей здесь.

У меня есть веб-приложение, которое настраивается администраторами. Это означает, что администратор может добавлять новую схему таблицы или редактировать столбцы таблицы, добавлять новые столбцы таблицы и т. д. Эти изменения сопоставляются с нашими логическими объектами (во многом похожими на EDMX), которые публикуются после изменения. При публикации мы создали хранимые процедуры с необходимыми изменениями, которые требуются.

Из пользовательского интерфейса мы используем эти логические объекты для подключения к БД (используя COM, который понимает сопоставление и выполняет соответствующие sprocs и представления и т. д.). Теперь я думаю использовать EF для замены модели логических объектов, которая у нас есть в настоящее время. Я могу динамически создавать файлы EDMX (файлы csdl, msl, ssdl, cs), но я не уверен, как их скомпилировать и динамически упаковать классы в DLL. Это означает, что когда я нажимаю кнопку, все файлы, связанные с edmx, будут созданы, а библиотеки DLL должны быть созданы на основе файлов CS, и веб-сайт должен иметь доступ к новым изменениям в коде.

Можете ли вы помочь мне, как автоматически и динамически компилировать файлы cs. У меня не будет исходного кода других файлов (например, default.aspx и других) у заказчика.

Спасибо, Альберт.


person Albert Arul prakash    schedule 31.01.2010    source источник


Ответы (2)


Подружитесь — вместо того, чтобы пытаться получить CSC из оболочки, рассмотрите возможность использования CSharpCodeProvider.CompileAssemblyFromFile.

Одна вещь, с которой нужно быть осторожным: если вы скомпилируете код, а затем попытаетесь скомпилировать его снова, вы можете заблокировать созданную сборку. Для этого я создал AsyncCompiler, который создает новый AppDomain, компилирует его и затем выгружает AppDomain.

Это какой-то довольно громоздкий код, но я делаю это (генерирую XML-файлы AEF, генерирую код из них, а затем компилирую все в сборку), и это работает хорошо. Единственное, что у меня не совсем правильно, - это динамический импорт хранимых процедур - они есть в моем SSDL, но не в CSDL или MSL. Поиск решения привел меня сюда.

Я надеюсь, что приведенных здесь ключевых слов достаточно, чтобы направить вас в правильном направлении.

person TonyG    schedule 24.02.2010
comment
Спасибо, TonyG. Можно ли предоставить фрагмент кода (может быть, скелет) вашего асинхронного компилятора. Да, ваши ключевые слова ведут меня во многие места. - person Albert Arul prakash; 24.01.2011
comment
Можете ли вы описать, что вы сделали в своем компиляторе? Я нахожусь в похожей ситуации. Я пытаюсь извлечь содержимое .csdl, .msl из самого edmx и встроить их в сборку. - person Robin Maben; 23.09.2014
comment
К сожалению, я сделал это четыре года назад и давно не посещал его. Так что моя память бесполезна для вас на данный момент, извините. Но это был очень классный код, который я мог бы откопать позже. Если вы работаете над проектом компании, то, возможно, я могу выделить на это время (сообщить мне в личку), иначе я не смогу больше расставлять приоритеты. Проблема с хранимыми процессами заключалась в том, что они просто не поддерживались в той версии EF, которую я использовал, но сейчас должны быть. Хотел бы я помочь больше здесь. - person TonyG; 23.09.2014

На самом деле у меня пока нет для вас окончательного ответа, но есть два возможных решения, которые вы могли бы рассмотреть, возможно, в ближайшем будущем:

1) Существует набор шаблонов CodeSmith под названием PLINQO, которые генерируют вашу модель Linq-to-SQL (DBMX) и связанные с ним файлы *.cs из вашей базы данных. Я лично спросил их о поддержке Entity Framework, и они подтвердили, что работают над этим, так что, возможно, они скоро это сделают.

Поскольку это шаблоны генерации кода и модели, вы определенно можете взять их для Linq-to-SQL и настроить их также для EDMX. Немного работы, но определенно возможно. Получив файлы *.cs и модель *.edmx, вы можете сгенерировать из них результирующую сборку с помощью компилятора командной строки CSC (C#), установленного на каждой машине с установленной .NET.

2) Вместе с .NET 4 новая Entity Framework 4 будет включать шаблоны T4 (еще одна технология генерации кода), которые позволят вам настроить генерацию кода. Здесь применима та же история — вы можете сгенерировать свою модель EDMX и связанные файлы *.cs для классов извне и создать сборку на лету из этих шаблонов.

См. другую запись в блоге по этой теме. , и вы должны найти много информации при поиске (или поиске) или «шаблонах EF4 T4».

Надеюсь, это поможет хотя бы немного!

person marc_s    schedule 31.01.2010
comment
Привет, я могу создавать классы EDMX и файлы CSDL для моей БД отдельно. В этом нет никаких проблем. Моя проблема в том, что всякий раз, когда я меняю EDMX (из моей пользовательской среды), мне нужно скомпилировать эти классы в DLL (при условии, что у меня есть права доступа к папке для того же). с веб-страницы нажмите кнопку. Я поражен в этом месте (компиляция), а не в генерации классов. Я не уверен, как вызвать CSC (на сервере) с веб-сайта. - person Albert Arul prakash; 02.02.2010