8

我刚刚开始一个非常大的网络项目,并且真的试图把所有事情都做好。

到目前为止我使用的工具是

  • ASP.NET MVC 3
  • 实体框架 4.3
  • 忍者3

一切进展顺利,但我发现 Entity Framework CodeFirst 的一些事情有点粗略。

例如,我必须使用http://codefirstmembership.codeplex.com/来设置会员信息作为代码优先设置的一部分。不得不使用第三方的东西感觉有点麻烦。显然我应该是 1337 足以“自己动手”,但我不想从一开始就咬太多。运行 aspnet_regsql 感觉很糟糕,每次更新数据库都会迷失方向。无论如何,都可以使用上面的库,这还不错。然而,脚手架似乎已经坏了。

现在除此之外,现在看来,当我在实时环境中运行时,这些东西会变得很有问题。无论如何,我想要在 dev db 和 live db 之间进行的任何架构更改都必须使用脚本手动管理,所以在这一点上,我不会首先失去代码的意义吗?

去年我一直在使用 Google App Engine,希望代码首先以同样的方式工作?即,进行更改,然后他们会修改实时数据。现在我假设,由于没有在应用引擎中进行严重的重构,它基本上不会损害生产中的任何东西。因此,您永远无法使用 AppEngine 重命名表。它总是会创建一个新表,并留下旧表。您将不得不手动移植数据。

所以我现在在想。为什么不先去数据库呢?我已经使用 linq2sql 3 年了,并且非常喜欢先使用 db。虽然 TBH 我的数据库源代码控制策略有点......缺乏。所以我希望代码优先能够强制改善这种情况,但它实际上让我觉得我应该首先使用 DB,并且严格控制它。

我真的很感激对这种情况有任何想法,而且,这与使用 Nhibinate 相比如何?

4

2 回答 2

7

您正在描述的升级方案已添加到 EF-Migrations 中。该版本的上线版本已经可用,它应该很快就会作为官方支持的版本发布。

查看:https ://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx?Redirected=true

查看:http ://coding.abel.nu/tag/ef-migrations/

于 2012-04-07T18:56:18.390 回答
3

只是我对此的看法...

你不需要永远做出选择——

您可以使用Seed自定义初始化程序(和迁移携手并进 - 通过迁移,您实际上可以手动更改它们,例如在此处添加索引等 - 尽管要小心),以“注入”原始 SQL(并且大部分需求可以通过那)。据我所知,您可以运行自定义批处理文件表单初始化程序(但没有尝试过,尽管我不明白为什么不这样做)。迁移是通过 PS 完成的,所以我猜这方面也有整合空间。

您可以使用它来制作原型和启动 - 让您的 C# 结构到位并快速同步 - 然后稍后对其进行调整 - 或者一旦修复使用一些“使用现有初始化程序”,它不会从代码中执行任何操作并将所有内容移动到 Db 端和你的 DBA。

IMO,从这个意义上说,在真正需要关闭 CF 并仅从 Db 工作之前,您可以“走得很远”。

对于较大的数据库或企业环境,它绝对不是适合这项工作的工具。

我认为现在可以安全生产了-但取决于您认为安全的内容,很少有...

此外,EF/CF 从一开始就已经走了很长一段路——我从一开始就使用它——最初它有很大的问题。最新版本现在在各个方面都非常可靠,所以我认为它已经到了那里。

...不利的一面 - 我已经使用代码优先方法(EF 和其他方法)制定了一些非常复杂的场景。然而,EF 几乎没有什么事情让我退缩(除了你提到的)......

UDF 支持,视图(使用 linq - 好像你不使用 LINQ 一个大的“专业人士”已经消失了) - 这应该出现在 EF 5.0 中(我没有检查,但这是他们所承诺的) - 作为对于更复杂的场景,您需要在 SQL 端进行优化(或者能够在后面执行自定义查询,然后再映射回来,即在那方面更灵活)。因此,如果它来了,那将是一件很有希望的事情(尽管我期望它并不完美)。(从好的方面来说,您实际上可以运行自定义查询,然后映射到您的对象 - 但这种工作,您不能做所有事情,所以它在某种程度上受到限制)

查询性能以及更苛刻的重型场景 - 这是我的主要问题。这也有望在 EF 5.0 中得到更好的体现 - 所以请拭目以待。

话虽如此 -
我最喜欢的是自定义或开源代码,例如解决方案 ORM - 您可以在其中控制更多事情。从长远来看,仍然有许多供应商支持等是使“官方”或 MS 实现更可行的原因。

希望这对任何人都有帮助

于 2012-04-15T18:29:52.277 回答