NHibernate和代码优先

时间:2010-11-18 15:49:20

标签: nhibernate fluent-nhibernate

您是否在实际应用程序中使用SchemaExport和SchemaUpdate?最初,您创建模型然后生成模式?它有用吗?或者,您只将它用于测试......

通常,我创建db(使用visual studio数据库项目),然后使用设计器创建映射和持久类或EF实体。但现在,我想尝试使用Fluent NHibernate进行代码优化。

我研究了SchemaExport和SchemaUpdate,发现了一些问题。例如,update不会删除db对象,如果表存在则创建非空列,如nullable,不会在多对多表上生成主键,依此类推。这意味着我必须经常重新创建数据库。但是,数据是什么?并且,如何将更改部署到生产数据库等等......

我想知道您是否真的在您的应用程序中使用代码和SchemaExport(SchemaUpdate)?也许你可以给我一些建议......

4 个答案:

答案 0 :(得分:8)

我在生产中使用SchemaUpdate。这是安全的,因为它永远不会像删除列那样进行破坏性操作。但是,它不是更新数据库的综合解决方案。如果您使用它,您仍然需要使用脚本来补充它以更新您的模式以执行删除(如您所述),索引,更改列类型,添加表数据等操作。但SchemaUpdate涵盖了90%的情况。

我发现的唯一缺点是,随着时间的推移,似乎偶尔会在我的表中添加重复的外键约束。

还有一件事:您应该从构建工具手动运行SchemaUpdate,而不是您的应用程序本身。 不安全为您的应用程序提供修改数据库架构的权限!

答案 1 :(得分:4)

我使用SchemaUpdate / SchemaExport快速演化我的模型,但它们不能替代数据库迁移工具。如您所述,在许多情况下,数据无法以合理的方式迁移。该工具没有足够的上下文。 (例如,如何自动将FullName列迁移到FirstName / LastName?)我在这里回答了类似的问题,我在NHibernate的上下文中讨论了数据库迁移工具。

NHibernate, ORM : how is refactoring handled? existing data?

答案 2 :(得分:2)

是的,您可以在实际应用中使用它们;我做。

当然,几乎所有的工作都是在第一次发生。我的做法是创建一个单独的项目,引用我的主项目程序集中的映射,并处理数据库创建和初始数据导入(如果有的话)。

项目投入生产后,我通常会从解决方案中卸载该项目,但请将其保留以供参考,或者我是否需要从创建脚本切换到更新脚本。

至于NHibernate创建数据库的方式,你必须在Fluent映射中做一些比其他方式更多的规范。我喜欢指定null / not null,外键约束名称等,以便最大限度地控制数据库的创建方式。

我认为你不想在这种情况下使用自动化。

答案 3 :(得分:1)

对于任何生成代码,无论是从您的问题中的工具或数据库生成poco生成,它可能会让你80%的方式。从那里开始调整另外20%是明智的,以添加你的索引和任何其他性能调整,以使其恰到好处。