我正在尝试使用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生成模式。
答案 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吧!
我希望这会有所帮助;我写得很快,所以如果我困惑你,请告诉我。