SharpArchitecture - Генерация схемы FluentNHibernate? - PullRequest
1 голос
/ 08 января 2010

Я пробую SharpArchitecture и хочу, чтобы FluentNHibernate сгенерировал мою схему базы данных для моего MVC WebSite.

Я немного растерялся, где это сделать. Я могу сделать это, добавив SchemaUpdate в файл global.asax.cs сразу после NHibernateInitializer.Instance().InitializeNHibernateOnce(InitializeNHibernateSession); в «Application_beginrequest». (Если я помещу его перед этим вызовом, SharpArch выдает исключение).

Это не кажется правильным и пахнет плохо. Такое ощущение, что я упускаю что-то базовое в архитектуре Sharp, которое позволяет автоматически генерировать схемы для моей БД (MSSQL2005). Или нет? Если нет, сообщите мне о передовых практиках создания схем с помощью свободно используемой архитектуры nhibernate и Sharp.

Заранее спасибо!

Редактировать: Могу добавить, что я смотрю на пример проекта Northwind в SharpArch, но вместо этого хочу, чтобы FNHb генерировал схему.

1 Ответ

3 голосов
/ 08 января 2010

Вы не хотите делать это в Application_BeginRequest.

Чтобы автоматически генерировать DDL, вам нужно сделать это в ваших классах TDD. Создайте специальный класс, который вы можете вызывать вручную, когда вам нужно сгенерировать DDL для вашей базы данных разработки.

Что-то вроде:

private static void CreateDatabaseFromFluentNHibernateMappings()
{
    var mappingAssemblies = RepositoryTestsHelper.GetMappingAssemblies();
    SchemaExport schema = new SchemaExport(NHibernateSession.Init(new SimpleSessionStorage(), mappingAssemblies, NHIBERNATE_CFG_XML));
    schema.Execute(true, true, false);
}

Это сгенерирует и выполнит DDL на основе ваших сопоставлений с базой данных, которую вы указали в файле конфигурации NHibernate (в NHIBERNATE_CFG_XML). База данных, пусть и пустая, уже должна существовать.

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

private static void UpdateExistingDatabaseFromFluentNHibernateMappings()
{
    var mappingAssemblies = RepositoryTestsHelper.GetMappingAssemblies();
    SchemaUpdate schema = new SchemaUpdate(NHibernateSession.Init(new SimpleSessionStorage(), mappingAssemblies, NHIBERNATE_CFG_XML));
    schema.Execute(true, true);
}

Это обновит существующую базу данных с изменениями, которые вы внесли в FNH, не разрушая существующую базу данных. Очень полезно, особенно если у вас уже есть тестовые данные в базе данных.

И, наконец, вы можете использовать NDbUnit для предварительной загрузки базы данных на основе тестовых данных, определенных в XML, в вашем проекте и в SCM. Прекрасно, когда у вас есть команда, работающая с одной и той же базой данных, и вы хотите предварительно загрузить ее данными, поэтому все начинают с одного и того же листа.

Использование NDbUnit:

private static void LoadTheTestDataintoDb()
{
    const string connectionstring = // your connection string to your db
    NDbUnit.Core.INDbUnitTest sqlDb = new NDbUnit.Core.SqlClient.SqlDbUnitTest(connectionstring);
    sqlDb.ReadXmlSchema(/* your XML schema file defining your database (XSD) */);
    sqlDb.ReadXml(/* Your XML file that has your test data in it (XML) */);
    // Delete all from existing db and then load test data allowing for identity inserts
    sqlDb.PerformDbOperation(NDbUnit.Core.DbOperationFlag.CleanInsertIdentity);
}

Для этого необходимо использовать NDbUnit . Спасибо Стивену Болену за это!

Надеюсь, это поможет; Я написал это довольно быстро, поэтому, если я вас запутал, дайте мне знать.

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