Я только что сгенерировал один с помощью отражения. Удивительно, но мне потребовалось меньше усилий, как только я задумался.
Как я это сделал: (иначе: алгоритм)
Груз в сборе.
Для каждого класса (типа) в сборке => создать таблицу
Генерация первичного ключа как $ {className} ID
для каждого свойства get / set в классе create => add field (сопоставить тип свойства с типом db)
Получить настраиваемые атрибуты внешнего ключа для класса => добавить ключ, если он не существует. установите его как fk_index (подпись пользовательского атрибута похожа на [ForeignKey ("TableA, TableB")]
Получить другие ограничения (например: проверить) настраиваемые атрибуты => сгенерировать в зависимости от ситуации
Если у вас нет доступа к исходному коду, прочитайте эти сопоставления из xml. ***** Edit: если xml всегда является последним вариантом решения для вас (как и для меня), вы можете создать методы расширения для ваших классов, которые возвращают IEnumerable . В этом случае ваша поверхность атрибута должна включать 'string TargetProperty {get; set;} 'свойство для хранения имени поля, на которое оно ссылается в случае проверки и уникальных ограничений. *****
Вот и все !!
Советы:
ЗАГРУЗКА В СБОРЕ: О! Кстати, одна распространенная проблема заключается в том, чтобы обеспечить наличие всех зависимостей сборки в том месте, где программа загрузки их найдет. Помните, Visual Studio не может помочь вам разрешить зависимости в этом сценарии динамической загрузки. Думайте, что вы запускаете csc.exe в командной строке. Если возникают проблемы с загрузкой сборки, убедитесь, что каждая внутренняя зависимость сборки модели домена доступна там, где ее может найти программа загрузки.
ТИП КАРТИРОВАНИЯ: Обнуляемым типам присваивается значение NULL, в противном случае НЕ NULL. Типы строк имеют значение nvarchar (max). Присвойте деньги десятичному или двойному размеру, как вы хотите, отобразите bool в бит или эквивалент, сопоставьте DateTime с datetime, сопоставьте byte [] с двоичным, сопоставьте long с числом (x, 0) и сопоставьте int с int.
АРХИТЕКТУРА ПРИЛОЖЕНИЯ: Мне было легко добавить консольное приложение в мое решение для немедленной необходимости, но тогда вы можете захотеть предоставить входные аргументы, чтобы легко перенести их в другие проекты. Чтобы сгладить это, вам понадобится, чтобы программа code gen имела dll-часть, которая будет объявлять ваши пользовательские атрибуты, в противном случае вы можете также передать спецификации типа или настроить разделы конфигурации для пользовательских атрибутов. используйте и настраивайте, и снова программа codegen точно знает, что она возвращает.
Надеюсь, это поможет.
P