首页 文章

NHibernate和代码优先

提问于
浏览
8

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

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

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

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

4 回答

  • 4

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

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

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

  • 2

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

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

  • 8

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

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

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

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

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

  • 1

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

相关问题