SharpArchitecture - FluentNHibernate架构生成?

时间:2010-01-07 22:47:44

标签: asp.net-mvc fluent-nhibernate

我正在尝试使用SharpArchitecture,并希望让FluentNHibernate为我的MVC WebSite生成我的数据库架构。

我有点迷失在哪里这样做。我可以通过在“Application_beginrequest”中NHibernateInitializer.Instance().InitializeNHibernateOnce(InitializeNHibernateSession);之后的global.asax.cs文件中添加SchemaUpdate thingy来实现。 (如果我在调用之前放置它,SharpArch会抛出异常)。

这似乎不对,闻起来很糟糕。感觉我在Sharp Architecture中遗漏了一些基本的东西,允许自动生成模式到我的数据库(MSSQL2005)。或者我不是吗?如果没有,请通过流畅的nhibernate和Sharp Architecture向我介绍模式生成的最佳实践。

提前致谢!

编辑:我可能会补充一点,我正在寻找SharpArch中的Northwind示例项目,但希望让FNHb生成模式。

1 个答案:

答案 0 :(得分: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);
}

这将根据您在NHibernate配置文件中指定的数据库(在NHIBERNATE_CFG_XML中)的映射生成并执行DDL。数据库虽然是空的,但应该已经存在。

您还可以在类中创建另一个方法,可以在开发时更新开发数据库的模式,以防您添加了新的实体,属性等。

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根据项目和SCM下的XML中定义的测试数据预加载数据库。很棒,当你有一个团队在同一个数据库上工作并且你想用数据预加载它时,每个人都从相同的空白板开始。

使用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。感谢Stephen Bohlen吧!

我希望这会有所帮助;我写得很快,所以如果我困惑你,请告诉我。