实体框架代码优先在生产中是否毫无意义/无用?什么是生产的良好EF策略?


29

我最近一直在使用Entity Framework 4.1 Code First进行编程,并且热爱它以进行开发,但是由于只有最终计划和快速变化的功能列表,因此我会不断修改类/数据库以满足应用程序的需求。

在开发中,没有实时数据,我可以轻松地删除整个数据库,以便使用新的架构重新创建它,但是很明显,当实时运行时,这非常糟糕!

我能看到的唯一解决方案是删除元数据表并手动保持数据库同步,或者基本上删除并重新设置种子。

我个人更喜欢第一种方法,因为我认为添加列/表比重新创建和迁移数据要容易得多,但是,除非我错过了什么,否则这将完全远离Code First。

因此,问题实际上是,Code First是否只是关于最初的开发?在生产环境中管理EF的良好策略是什么?


几天来一直想问这个问题,不确定是在这里还是在Stack Overflow上最好……
wilhil 2011年

Answers:


15

我的意见是,代码优先的自动数据库创建仅用于开发。我在Stack Overflow上回答了类似的问题,在其中我描述了如何升级数据库以及为什么自动功能在生产中很糟糕:

升级数据库是半手动任务。后面应该没有自动未经测试的魔术-而且EF 4.1当前没有任何可用的魔术(只有一些有关ADO.NET团队正在开发的功能的介绍)。

您也可以检查此问题,以更好地了解网站如何升级。


再次问好!-您很快就可以解决EF问题!:) ...不知道没有你我会在哪里!
2011年

几个月后,我的程序就完成了……我将其标记为答案,但是,我想知道是否发生了任何变化/是否有任何资源可以帮助您?
wilhil 2011年

2
“迁移”的首次公开预览已发布。blogs.msdn.com/b/adonet/archive/2011/07/27/...
拉吉斯拉夫Mrnka

谢谢,现在看看吧!我喜欢用Code First开发,但是,我很紧张/担心以后再更改!
wilhil 2011年

如何处理为其他目的(例如,报告未由应用程序使用)直接在数据库中创建StoredProcs或View的情况。首先,我们需要知道哪些SP受模式更改的影响。
softveda 2012年

5

维护升级脚本

在数据库本身中,维护一个表,该表保存着具有模式版本的记录。

当您启动应用程序时,它会根据二进制文件应使用的版本来检测版本。如果不同,它将执行(或要求用户)升级脚本。

不要忘记先备份数据库。


下一步:您被解雇了;)数据库更新不应在没有先备份的情况下自动自动升级(可能会在停机期间),而不是在ONE USER运行较新版本的情况下。您的方法是完美的-关闭带有大量错误的大型部署。
TomTom 2014年

@TomTom:这取决于。多年来,我们一直在完美地运行数据库应用程序,而该应用程序正是这样做的:为新版本自动进行模式更改,当应用程序检测到过旧的版本时由应用程序完成。备份也每天进行,我们保持所有架构更改向后兼容(仅添加字段和表,绝不删除任何字段和表)。我同意,当更改不向后兼容时,您提到的措施很重要,并且您不能保证所有客户端应用程序都可以同时更新(例如,对于大型企业数据库)。
布朗

最重要的是,这些更改是不重要的。尝试更改2TB表中的字段(是的,我确实处理了这一点-它甚至不是数据仓库)。您可能会陷入不断累积技术债务的情况,因为您只能添加字段,而无法清理。
TomTom 2014年

2

这个问题在某种程度上是有缺陷的,因为它使编程模型和运行环境之间没有联系。

代码优先主要是开发速度驱动程序,实际上并没有连接到运行时系统。

在生产环境中,您将适当地使用一个配置设置,该配置设置将拒绝运行时删除/更新数据库模型的可能性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.