2010-01-07 2 views
1

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

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

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

Заранее благодарен!

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

ответ

3

Вы не хотите делать это в 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. Спасибо Стивен Болен за это!

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

+0

Thank you Todd! Я начал думать о создании отдельного консольного приложения только для создания схемы, но делать это с остальными моими испытаниями кажется хорошей идеей. Спасибо за все замечательные примеры кода, они обязательно помогут! –