NHibernate和代码优先

NHibernate和代码优先,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,您是否在实际应用程序中使用SchemaExport和SchemaUpdate?最初,您创建模型,然后生成模式?它有用吗?或者,您仅将其用于测试 通常,我创建db(使用VisualStudio数据库项目),然后使用designer创建映射和持久类或EF实体。但现在,我想用Fluent NHibernate尝试代码优先的方法 我研究了SchemaExport和SchemaUpdate,发现了一些问题。例如,update不删除db对象,创建非空列(如表存在则为nullable),不在多对多表上生成主键

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

通常,我创建db(使用VisualStudio数据库项目),然后使用designer创建映射和持久类或EF实体。但现在,我想用Fluent NHibernate尝试代码优先的方法

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


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

我在生产中使用SchemaUpdate。它之所以安全,正是因为它从不执行诸如删除列之类的破坏性操作。但是,它不是更新数据库的全面解决方案。如果您使用它,您仍然需要用脚本来补充它,以更新您的模式,以执行诸如删除(如您所提到的)、索引、更改列类型、添加表数据等操作。但是SchemaUpdate为我提供了90%的支持

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


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

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

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

一旦项目投入生产,我通常会从解决方案中卸载该项目,但保留它以供参考,或者如果我需要从创建脚本切换到更新脚本

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


我认为在这种情况下,您永远不会想使用自动映射。

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


只要使用任何生成代码,无论是从工具生成poco还是从数据库生成(如您的问题所述),都可能使您达到80%的目标。从这里开始,明智的做法是调整其他20%以添加索引和任何其他性能调整,使其恰到好处