Ответ 1
Посмотрите RhinoCommons. Под Rhino.Commons.ForTesting, в UnitOfWorkTestContextDbStrategy.cs, Ayende сделал там некоторую рутину, которая создает базы данных.
Я использую NHibernate с FluentNHibernate для моего DAL. Я также использую SchemaExport
и SchemaUpdate
для создания и обновления моей схемы базы данных.
Моя проблема в том, что все операции схемы требуют, чтобы база данных существовала до их работы. Я хочу программно создать свою базу данных и обновить схему, так как может быть несколько баз данных, а создание базы данных - это не только однократная операция.
Я знаю, что могу сделать это вручную, выполнив команду создания базы данных при подключении к основной базе данных, но это неправильно, учитывая, что я использую NHibernate для всех моих взаимодействий с базами данных. В стороне, я использую базу данных SQLite inmemory для своих модульных тестов, поэтому любой sql, который я пишу, должен будет знать, какую базу данных я использую.
Есть ли способ получить NHibernate для создания моей базы данных для меня?
Посмотрите RhinoCommons. Под Rhino.Commons.ForTesting, в UnitOfWorkTestContextDbStrategy.cs, Ayende сделал там некоторую рутину, которая создает базы данных.
Я думаю, что создание db с NHibernate приятно, если вы начнете разрабатывать приложение с помощью модели домена. Я имею в виду - это дает представление о том, как должен выглядеть ваш db. Но в целом - sql-скрипты должны использоваться.
Я слышал, что некоторые разработчики используют NHibernate db для тестирования интеграции, они создают легкий SQL-db на лету.
Как сгенерировать db с NHibernate? Вот как я это делаю:
public static void InitSessionFactory()
{
var connectionString =
ConfigurationManager
.ConnectionStrings["MyConnectionString"]
.ConnectionString;
var cfgFromXml = new Configuration();
cfgFromXml.Configure();
var cfg = Fluently.Configure(cfgFromXml)
.Database(MsSqlConfiguration.MsSql2005
.ConnectionString(x => x.Is(connectionString))
.UseReflectionOptimizer())
.Mappings(x => x.FluentMappings
.AddFromAssemblyOf<NHibernateBootstrapper>())
.ExposeConfiguration(BuildSchema);
ObjectFactory.Inject(cfg.BuildSessionFactory());
}
private static void BuildSchema(Configuration config)
{
//Creates database structure
//new SchemaExport(config)
// .Create(false, true);
}
Нет, NHibernate не будет создавать базу данных для вас. Создание баз данных - это то, что вы обычно не хотите делать "на лету". Для этого требуется множество параметров конфигурации, и это очень специфичная для конкретной базы данных, даже конкретная версия базы данных.
Для нашего продукта я написал класс, который устанавливает базу данных. Он используется для установщика, тестов интеграции и инструмента обслуживания базы данных.
Существует также специальный случай, когда клиент не хочет предоставлять право создавать базы данных. Затем мы ожидаем, что он сделает это и пропустит эту часть.
Мы используем SchemaExport для предоставления схемы и задачи Nant для удаления и воссоздания базы данных. Другая задача Nant запускает код экспорта схемы и код dataloading, который существует в виде теста интеграции, выполняемого задачей nunit. Здесь здесь.
Хм, вы действительно можете использовать SchemaExport, как вы упоминаете, но я вижу NHibernate как способ преодоления разрыва между моделью OO-домена и хранилищем реляционных сохраняемости. То есть для меня NHibernate предназначается для сохранения и извлечения объектов в моей модели домена.
Если вы хотите сделать обновления схемы, imho, вы не должны использовать NHibernate (если возможно вообще), поскольку это не цель NHibernate; есть "доменный язык", называемый SQL:), который хорош в выполнении этих вещей.
Чтобы создать мою базу данных и обновить мою схему базы данных, я использую Migrator.NET, которая представляет собой структуру, которая позволяет вам писать классы С# там, где вы указываете, что нужно сделать (создать таблицу, добавить столбец, и т.д.).
Преимущество этого заключается в том, что Migrator.NET также поддерживает несколько СУБД, поэтому вы не вписываетесь в SQL-код, специфичный для БД.
Ищите это самостоятельно, поскольку я видел это в java - подобный вопрос здесь: Генерировать базу данных из файлов конфигурации NHibernate