0

我刚刚开始学习 ASP.NET MVC 3,在决定为我的应用程序连接到数据库的最佳方式时遇到了很大的麻烦。由于我的应用程序数据库将定期增强,因此可以添加/删除新表、列,并且可能还会更改某些列的数据类型。因此,对于这种情况,哪种方法最适合我,以便我的代码易于管理,并且这些更改不会影响我的代码(例如:如果我在 EF 中删除并重新选择表,那么将生成新类并且代码与课程会受到影响)?我读过有代码优先数据库优先实体框架企业库数据访问块SQL 连接调用存储过程等方法但我不确定哪个在这种情况下效果最好,可能是我错过了 ASP.NET MVC 3 连接到数据库的真正风味。

编辑1

我不知道为什么它被要求关闭,但除了这个论坛,我别无选择。我发现了类似的问题,它说明了我的问题Code First vs Data First的部分内容。关于数据库优先方法,答案刚刚在我脑海中造成了混乱。

4

3 回答 3

2

首先,您正在开发 MVC 应用程序这一事实与您将使用哪种技术来构建数据访问层的决定完全脱钩。

.NET 有许多数据访问选项,分为两类。我列出了我心中的一个,每个都有几点

直接数据访问

  1. ADO.NET DataReader(速度快,人工多,必须手动编写 SQL 代码)
  2. ADO.NET 数据集

对象关系映射器 (ORM)

  1. LINQ2SQL
  2. 实体框架数据库优先
  3. 实体框架代码优先
  4. 休眠
  5. 许多商业第三方工具
  6. 小巧玲珑

手动编写 SQL 代码绝对可以让您快速访问,但代价是您必须自己完成所有操作。

ORM 为您的数据库提供了某种抽象层,因此您可以只使用对象。这是以牺牲一些性能为代价的(查询生成、从 SQL 结果到对象的映射)。

Dapper 在这里有些特别,因为它是一个专注于读取性能的 ORM,但它需要您自己编写 SQL 查询,并且只有有限的写入支持。

我个人有使用 DataSets、LINQ2SQL、EF Db First、EF Code First 和 Dapper 的经验。当我不得不启动一个新应用程序时,如果您不希望负载非常高,我会使用 EF Code First。当没有现有数据库时尤其如此。您只需编写类并生成数据库。更酷的是自动迁移,您可以在其中更改类,EF 将更新您的数据库结构。如果您注意生成的代码,这甚至可以在不丢失数据的情况下实现。

如果您需要高性能,那么我会选择 Dapper,您可以完全控制 SQL,开销很小,但映射引擎很舒适。

另外,你会在so上发现很多这样的问题(只需寻找最喜欢的 orm):

于 2012-11-29T08:53:52.607 回答
1

我正在类似的场景中开发,在旅途中创建、删除或更新表(不是一个非常好的场景)。我目前正在使用这种Database First方法,因为它非常适合这种情况。

您应该在以下情况下使用Database First

您将进行数据库结构更改,同时用户将插入或更新数据。否则,如果您选择Code First方法,每次更改数据库结构时,您的数据都会被删除,您可以实施一些黑客攻击以恢复它,但如果您的应用程序正在运行,可能会发生很多问题。

如何Database first处理结构变化:

  1. 您在“用户”表(在您的数据库中)中进行了一些更改。
  2. 你去 Visual Studio,并使用 DBContext 它将更新“用户”类。

如何Code first处理结构变化:

  1. 您更改了“用户”类(在您的模型中)。
  2. 将自动更新您的数据库以填充用户表中所需的更改(丢失存储的数据)
  3. 如果你处理它,你可以恢复你的数据(但如果你的数据库正在使用它就不是一件好事)。

无论如何,我不建议您以这种方式工作,如果您的数据库设计得很好,然后在此基础上开始编码,那就更好了。

编辑:

我的答案似乎不再正确,因为 Entity Framework 4.3 他们添加了一些新的很酷的功能:Code First Migrations,感谢@soadyp 指出我的错误。

于 2012-11-28T22:25:36.220 回答
1

Jan 很好地指出 EF 不是唯一的 ORM。但是既然你用 EF 标签问了,那么他就是一个 EF 视角。

从 EF4.3 开始,EF 支持基于代码的代码优先迁移。即更改您的模型和代码首先可以更改数据库以添加新的列和表。为此有一个新的数据库初始化程序。它甚至会删除列而不会将数据丢失到行的其余部分。

同样,您可以先使用 DB 继续从 DB 导入/更新模型。具有从现有数据库导入的更新的 t4 模板创建部分 POCO 类。因此,您可以安全地扩展生成的 MODEL 类并继续重新导入并且不会丢失任何内容。

因此,您可以在可变 DB/模型场景中使用 Code first 或 DB first。

我在一个绿地站点中使用了这两种技术。一开始我对 DB 感觉更舒服。然后,一旦我在 ef4.3 中找到了新的迁移选项,我就确信要转换。由于 Microsoft 提供了强大的电动工具,因此转换速度很快。NUGET Entity Framework power Tools(截至 2012 年 11 月的 beta 2)http://blogs.msdn.com/b/adonet/ 有一个选项可以先从数据库逆向工程代码。因此可以先从 DB 转换为先代码。然后使用基于代码的迁移。

于 2012-11-30T10:35:33.150 回答