NHibernate 和代码优先
Posted
技术标签:
【中文标题】NHibernate 和代码优先【英文标题】:NHibernate and code first 【发布时间】:2010-11-18 15:49:20 【问题描述】:您在实际应用程序中使用 SchemaExport 和 SchemaUpdate 吗?最初,您创建模型然后生成模式?它有效吗?或者,您仅将其用于测试...
通常,我创建 db(使用 Visual Studio 数据库项目),然后使用设计器创建映射和持久类或 EF 实体。但现在,我想尝试使用 Fluent NHibernate 的代码优先方法。
我研究了 SchemaExport 和 SchemaUpdate 并发现了一些问题。例如,更新不会删除数据库对象,如果表存在则创建非空列(如可为空),不会在多对多表上生成主键等等。这意味着我必须经常重新创建数据库。但是,数据呢?还有,如何将更改部署到生产数据库等等...
我想知道您是否真的在应用程序中使用代码优先和 SchemaExport(SchemaUpdate)?也许你能给我一些建议......
【问题讨论】:
【参考方案1】:我在生产中使用 SchemaUpdate。它是安全的,正是因为它从不执行删除列之类的破坏性操作。但是,它不是更新数据库的全面解决方案。如果你使用它,你仍然需要用脚本来补充它来更新你的模式来做一些事情,比如删除(正如你提到的)、索引、更改列类型、添加表数据等。但是 SchemaUpdate 涵盖了我 90% 的情况。
我发现的唯一缺点是,随着时间的推移,它似乎偶尔会向我的表添加重复的外键约束。
还有一件事:您应该从构建工具手动运行 SchemaUpdate,而不是您的应用程序本身。授予您的应用程序修改数据库架构的权限是不安全的!
【讨论】:
【参考方案2】:我使用 SchemaUpdate/SchemaExport 来快速改进我的模型,但它们不能替代数据库迁移工具。正如您所提到的,在许多情况下,数据无法以合理的方式迁移。该工具没有足够的上下文。 (例如,如何自动将 FullName 列迁移到 FirstName/LastName?)我在这里回答了一个类似的问题,我在 NHibernate 的上下文中讨论了数据库迁移工具。
NHibernate, ORM : how is refactoring handled? existing data?
【讨论】:
【参考方案3】:是的,您可以在实际应用中使用它们;我愿意。
当然,几乎所有的工作都发生在第一次。我的做法是创建一个单独的项目,该项目引用我的主项目程序集中的映射并处理数据库创建和初始数据导入(如果有)。
一旦项目投入生产,我通常会从解决方案中卸载该项目,但保留它以供参考,或者如果我需要从创建脚本切换到更新脚本。
至于 NHibernate 创建数据库的方式,您必须在 Fluent 映射中做更多的规范。我喜欢指定 null/not null、外键约束名称等,以最大限度地控制数据库的创建方式。
我认为您不会想在这种情况下使用自动映射。
【讨论】:
【参考方案4】:就任何生成代码而言,无论是从工具生成 poco 还是在您的问题中生成数据库,它可能会让您完成 80% 的工作。从那里调整另外 20% 以添加索引和任何其他性能调整以使其恰到好处是明智的。
【讨论】:
以上是关于NHibernate 和代码优先的主要内容,如果未能解决你的问题,请参考以下文章
您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?