2010-08-13 3 views
3

Возможно ли сгенерировать схему базы данных из nHibernate, где я предоставил nHibernate конфигурацию в базу данных, но я не написал никаких сопоставлений.Использование nHibernate для извлечения схемы базы данных

Я хочу программно получить метаданные/схемы базы данных.

Я использую базу данных Oracle. Я попробовал два подхода:

Подход один:

public DatabaseMetadata GetMetadata(DbConnection connectionIn) 
    { 
     return new DatabaseMetadata(connectionIn, _dialect); 
    } 

Проблема: Это, кажется, что мне нужно, однако, хотя он правильно соединяет, он не подобрал какую-либо из мои таблицы. Все, что я предоставил, это объект конфигурации nHibernate, который был заполнен содержимым моего файла nHibernate.xml.config (строка подключения, клиент драйвера и т. Д.).

Вопрос: Зачем ему не возвращать данные таблицы? Он подключен правильно, но ничего не находит!

подход два:

public void DatabaseSchema() 
{ 
    var schema = new SchemaExport(nHibernateConfiguration); 
    schema.SetOutputFile("schema.dll"); 
     schema.Create(true, true); 
} 

nHibernateConfiguration является экземпляром (имущество от класса) объекта конфигурации NHibernate, заселенный с содержимым из класса nHibernate.xml.config.

Задача: Это просто не работает. Сбои со следующим исключением:

NHibernate.MappingException: Диалект не поддерживает идентификационную ключ поколения

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

Вопрос: ли мое убеждение, что этот метод будет только генерировать схему, основанную на моих отображений? Если нет, правильно ли я использую его?

Надеюсь, это достаточно ясно, комментарий, если мне нужно предоставить дополнительную информацию.

Спасибо заранее.

Чтобы быть ясным: у меня есть база данных и вы хотите получить метаданные, представляющие базу данных, схему.

ответ

3

NHibernate фактически основан на файлах сопоставления. Вы можете создавать из них классы или таблицы. Существуют инструменты для создания файлов сопоставления, но они основаны на классах, а не на таблицах.

Ответы на конкретные вопросы:

подход один: NHibernate не читает определения таблиц из базы данных. Все определения таблиц должны быть указаны в файлах сопоставления.

Подход к двум:SchemaExport создает SQL-файл (создание таблиц, индексов и т. Д.) Из определений сопоставления. Фактически рекомендуется использовать его, если вам не нужно справляться с устаревшими базами данных. Выходной файл следует называть * .sql, а не * .dll.

Ошибка, которую вы получаете, скорее всего, связана с тем, что вы пытаетесь создать идентификатор идентификатора в базе данных оракула (или другой, которая не поддерживает столбцы идентификации). Вместо этого используйте hilo (или, если вам это не нравится, guid.comb или родной). Мне просто интересно, почему вы получили эту ошибку, я думал, что вы не пишете никаких файлов сопоставления?

Вывод:

Я не знаю ни одного инструмента, которые создают файлы сопоставления NHibernate из таблиц базы данных. Может быть один, скорее всего, он не свободен или не созрел (потому что иначе это было бы хорошо известно). Поэтому я предлагаю подумать о создании определений таблиц вместо этого, или, если у вас есть устаревшая база данных, вам нужно вручную написать файлы сопоставления.

+0

Если в его базе данных есть только несколько полей, я бы согласился отобразить все вручную. В противном случае возьмите инструмент, чтобы, по крайней мере, генерировать правильные имена и сопоставление членов. Поскольку большинство инструментов, похоже, имеют проблемы с созданием FK (или его база данных может не использовать их, если они устарели) и типы отношений, он может просто установить их вручную. – Mike

+0

Cheers. Это помогло мне разобраться в сути проблемы. – Damien

+0

llbgen - это программа с функцией автоматического создания сопоставления :) – harry180

1

Возможно, я неправильно интерпретирую вопрос, это не совсем понятно, о чем вы просите.

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

Fluent NHibernate Automapper

ConfORM

Существует приличная кривой обучения для обоих вариантов.

Другой вариант - попробовать один из коммерческих визуальных дизайнеров для NHibernate, хотя эти инструменты недостаточно зрелы, чтобы сделать это очень хорошо в моем опыте.

Core NHibernate не предназначен или не предназначен для создания таблиц без файлов сопоставлений.

+0

Это близко к тому, о чем я говорил. База данных уже заполнена таблицами и столбцами, я хочу экспортировать схему ... В других словах я хочу сделать обратное. – Damien

+0

В каком формате вы хотите использовать метаданные/схему? Вы хотите, чтобы классы POCO и файлы сопоставления NHibernate hbm.xml, созданные из базы данных? Или вы хотите, чтобы метаданные были в другом формате, таком как SQL Script? Вы ищете .NET API в метаданных базы данных, как то, что предоставляет SQL Server через SMO? –

+0

. API-интерфейс .Net был бы отличным .., иначе POCO плюс nHibernate-сопоставления были бы удобны. Это в основном экспериментально. Мне нужно выбрать лучший формат. Я думал, что метаданные базы данных будут работать (поставляется с nHibernate) – Damien

3

Есть несколько инструментов, которые помогут вам, но я использую большинство из них следующие два.

  1. NHibernate Schema Tool
  2. NHibernate Mapping Generator

Если у вас уже есть схема, вы можете использовать Mapping Generator NHibernate для создания отображения. Затем вы можете использовать сопоставления для того, что хотите. Измените их и используйте NHibernate Schema Tool для управления реальной схемой.

Если у вас нет какой-либо схемы, и именно это вы пытаетесь создать, вы на правильном пути. Сначала вам нужно «отобразить» свои классы. Предпочтительно использовать Fluent NHibernate или ConfORM, например, Майкл Мэддокс.

Я не знаю цели этого. Если это управление схемой базы данных, я бы рекомендовал не использовать NHibernate. NHibernate никогда не разрабатывался как инструмент менеджера схемы, поэтому, вероятно, его не следует использовать таким образом. По общему признанию, я мог бы как-то вас неправильно понять, и этот ответ может быть совершенно неправильным.

+0

Просто голова, если вы в конечном итоге используете NHibernate Mapping Generator, у вас могут возникнуть проблемы с извлечением всех таблиц из базы данных Oracle. Я использовал его вчера и должен был изменить, какая таблица использовалась для получения имен таблиц и ограничений. – Mike

Смежные вопросы