我刚刚开始学习ASP.NET MVC 3,在为我的应用程序确定连接到数据库的最佳方式时遇到了很大的困难。由于我的应用程序数据库将定期进行增强,因此可以添加/删除新的表、列,也可以更改某些列的数据类型。那么,对于这种情况,哪种方法对我来说是最好的,这样我的代码就可以管理,并且这些更改不会影响我的代码(例如:如果我删除并重新选择EF中的表,那么将生成新的类,并且与该类相关的代码将受到影响)?我读到过一些方法,如代码优先、数据库优先实体框架,企业库数据访问块和SQL连接调用存储过程。但我不确定哪种方法在这种情况下最有效,可能是我错过了连接数据库的ASP.NET MVC 3的真正风格。
第1版
我不知道为什么它被要求关闭,但除了这个论坛,我别无选择。我发现了类似的问题,说明了我的问题"代码优先"与"数据优先"的部分内容。这个答案只是在我脑海中制造了一个关于数据库优先方法的混乱。
首先,您正在开发MVC应用程序的事实与您将使用哪种技术构建数据访问层的决定完全脱钩。
对于.NET的数据访问,有许多选项可分为两类。我列出了我脑海中的一个,每个都有几点
直接数据访问
- ADO.NET DataReader(速度快,手工工作量大,必须编写手动SQL代码)
- ADO.NET数据集
对象关系映射器(ORM)
- LINQ2SQL
- 实体框架数据库优先
- 实体框架代码优先
- NHibernate
- 许多商业第三方工具
- Dapper
手动编码SQL无疑会给您提供最快速的访问权限,但代价是您必须自己完成所有工作。
ORM为您的数据库提供了某种抽象层,因此您可以只使用对象。这是以一些性能损失为代价的(查询生成、从SQL结果到对象的映射)。
Dapper在这里有点特别,因为它是一个专注于读取性能的ORM,但它需要您自己编写SQL查询,并且只有有限的写支持。
我个人有数据集、LINQ2SQL、EF Db First、EF Code First和Dapper方面的经验。当我不得不启动一个新的应用程序时,如果你不期望很高的负载,我会使用EF Code First。当没有现有数据库时,情况尤其如此。您只需编写类并生成数据库即可。更酷的是自动迁移,您可以更改类,EF将更新数据库结构。如果您注意生成的代码,这甚至可以在不丢失数据的情况下实现。
当你需要高性能时,我会选择Dapper,在那里你可以完全控制SQL,开销很小,但有一个舒适的映射引擎。
此外,你会在so上发现很多这样的问题(只需查找最喜欢的orm):
- https://stackoverflow.com/q/3505/25727
- ASP.NET MVC和ORM选择
Jan很好地指出EF并不是唯一的ORM。但既然你用EF标签提问,那么他就是EF的视角。
自EF4.3以来,EF一直支持基于代码的代码优先迁移。Ie更改您的型号,COde可以先更改DB以添加新列ns和表。为此,有一个新的DB初始值设定项。它甚至会删除列,而不会丢失行的其余部分的数据。
同样,您可以先从DB中导入/更新模型。最近的t4模板使用从现有DB导入创建了Partial POCO类。因此,您可以安全地扩展生成的MODEL类,并继续重新导入,不会有任何损失。
因此,您可以在可变的DB/Model场景中使用Code first或DB first。
我在一个绿地网站上使用了这两种技术。首先,我对DB感到更自在。然后,当我在ef4.3中找到新的迁移选项时,我被说服转换。它转换得很快,因为微软提供了一个强大的工具。NUGET实体框架强大工具(2012年11月测试版2)http://blogs.msdn.com/b/adonet/有一个选项可以先从数据库中反向工程代码。所以可以先从DB转换为代码。然后使用基于代码的迁移。
我在类似的场景中进行开发,在旅途中创建、删除或更新表(这不是一个很好的场景)。我目前正在使用Database First
方法,因为它非常适合这种情况。
如果:,则应使用Database First
您将进行数据库结构更改,同时用户将插入或更新数据。否则,如果你选择Code First
方法,每次更改数据库结构时,你的数据都会被删除,你可以实施一些黑客操作来恢复它,但如果你的应用程序正在运行,可能会发生很多问题。
Database first
如何应对结构变化:
- 您在(数据库中的)"Users"表中进行了一些更改
- 转到Visual Studio,使用DBContext将更新"User"类
Code first
如何处理结构变化:
- 您可以更改您的"User"类(在您的模型中)
- 数据库将自动更新,以填充"用户"表中所需的更改(丢失存储的数据)
- 如果你处理了它,你可以恢复你的数据(但如果你的数据库正在使用,那就不是一件好事)
无论如何,我不建议你用这种方式工作,最好是你的数据库设计得很好,然后再开始编码。
编辑:
我的答案似乎不再正确,因为EntityFramework4.3他们添加了一些很酷的新功能:代码优先迁移,感谢@soadyp指出了我的错误。