Вы не хотите делать это в 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. Спасибо Стивен Болен за это!
Надеюсь, это поможет; Я написал это быстро, поэтому, если я смутил вас, дайте мне знать.
Thank you Todd! Я начал думать о создании отдельного консольного приложения только для создания схемы, но делать это с остальными моими испытаниями кажется хорошей идеей. Спасибо за все замечательные примеры кода, они обязательно помогут! –