Схема базы данных от DomainModel - PullRequest
1 голос
/ 12 марта 2009

У кого-нибудь есть опыт создания схемы базы данных из модели домена c # (.net 3.5)? Какой из инструментов производит самый чистый скрипт?

Telerik OpenAccess ORM был бы в порядке, но он не выдает чистые имена столбцов из классов c #, если поля свойств используют неявные частные поля .net 3.5.

Мне просто нужен начальный сценарий gen, который я затем буду улучшать и поддерживать вручную.

P

Ответы [ 2 ]

2 голосов
/ 15 марта 2009

Я только что сгенерировал один с помощью отражения. Удивительно, но мне потребовалось меньше усилий, как только я задумался.

Как я это сделал: (иначе: алгоритм)

  1. Груз в сборе.

  2. Для каждого класса (типа) в сборке => создать таблицу

  3. Генерация первичного ключа как $ {className} ID

  4. для каждого свойства get / set в классе create => add field (сопоставить тип свойства с типом db)

  5. Получить настраиваемые атрибуты внешнего ключа для класса => добавить ключ, если он не существует. установите его как fk_index (подпись пользовательского атрибута похожа на [ForeignKey ("TableA, TableB")]

  6. Получить другие ограничения (например: проверить) настраиваемые атрибуты => сгенерировать в зависимости от ситуации

  7. Если у вас нет доступа к исходному коду, прочитайте эти сопоставления из 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

0 голосов
/ 18 марта 2009

P

Я использовал Reflection, Introspection ( FxCop SDK ) и CodeModel ( Visual Studio Automation ) для решения аналогичной проблемы . Я перешел от одного API к другому в этом порядке и больше всего понравился CodeModel. Проблема с отражением заключается в том, что он блокирует сборки в памяти до тех пор, пока загружен домен приложений. Это проблема в T4, хотя она может отсутствовать в вашем автономном исполняемом файле. С T4 вы не можете перекомпилировать оригинальную сборку после генерации кода из его метаданных. Самоанализ работал хорошо, не блокировал сборки, но все еще не задокументирован, плюс он требует от вас компиляции сборки, прежде чем вы сможете использовать ее метаданные. CodeModel документирован и позволяет получать доступ к метаданным непосредственно из исходного кода C #.

Надеюсь, это поможет, Олег

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...