MVC 3应用程序与不断变化的数据库的连接

时间:2012-11-28 21:51:19

标签: asp.net-mvc-3 entity-framework enterprise-library code-first ef-database-first

我刚刚开始学习ASP.NET MVC 3,我很难确定为我的应用程序连接数据库的最佳方法。由于我的应用程序数据库将定期增强,因此可以添加/删除新表,列,也可以更改某些列数据类型。因此,对于这种情况,哪种方法最适合我,以便我的代码可以管理,这些更改不会影响我的代码(例如:如果我删除并重新选择EF中的表,那么将生成新类并且代码与班级会受到影响)?我读过有些方法,如 Code First Database First Entity Framework Enterprise Library Data Access Block SQL连接调用存储过程,但我不确定哪种方法在这种情况下最有效,可能是我错过了ASP.NET MVC 3连接到数据库的真正风格。

EDIT1

我不确定为什么会被召唤关闭但是我没有其他选择而不是这个论坛。我发现了类似的问题,其中陈述了我的问题Code First vs Data First的部分内容。答案刚刚在数据库第一种方法中产生了混乱。

3 个答案:

答案 0 :(得分:2)

首先,您正在开发MVC应用程序的事实与您将用于构建数据访问层的技术的决定完全分离。

.NET的数据访问有很多选项,分为两类。我在脑海中列出了一个,每个点几个

直接数据访问

  1. ADO.NET DataReader(快速,多手工,必须编写手动SQL代码)
  2. ADO.NET DataSets
  3. 对象关系映射器(ORM)

    1. LINQ2SQL
    2. Entity Framework DB first
    3. Entity Framework Code First
    4. NHibernate
    5. 许多商业第三方工具
    6. Dapper
    7. 手动编写SQL代码可以为您提供绝对的访问权限,但需要付出代价,您必须自己完成所有操作。

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

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

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

      当您需要高性能时,我会选择Dapper,您可以完全控制SQL,只需很少的开销,但需要一个舒适的映射引擎。

      此外,您会发现很多这样的问题(只需查看收藏的orm ):

答案 1 :(得分:1)

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

如果符合以下条件,您应该使用Database First

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

Database first如何处理结构更改:

  1. 您在“用户”表格中(在数据库中)进行了一些更改。
  2. 您转到Visual Studio,并使用DBContext更新“用户”类。
  3. Code first如何处理结构更改:

    1. 您更改了“用户”类(在您的模型中)。
    2. 将自动更新您的数据库以填充Users表中所需的更改(丢失存储的数据)
    3. 如果您处理它,您可以恢复您的数据(但如果您的数据库正在使用它将不是一件好事。)
    4. 无论如何我不建议你这样工作,如果你的数据库完全设计得好,然后开始编码就好了。

      修改

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

答案 2 :(得分:1)

Jan很好地指出EF不是唯一的ORM。 但是,既然你问EF标签,那么他就是EF的观点。

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

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

因此,您可以在可变数据库/模型方案中使用Code first或DB first。

我在绿色现场使用了这两种技术。 首先我觉得DB更舒服。 然后,当我在ef4.3中找到新的迁移选项时,我确信转换。 由于微软拥有强大的电动工具,因此转换速度很快。 NUGET实体框架电源工具(截至2012年11月的beta 2)http://blogs.msdn.com/b/adonet/ 可以选择首先从DB反向工程代码。所以可以先从DB转换为代码。然后使用基于CODE的迁移。