我刚刚开始学习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的部分内容。答案刚刚在数据库第一种方法中产生了混乱。
答案 0 :(得分:2)
首先,您正在开发MVC应用程序的事实与您将用于构建数据访问层的技术的决定完全分离。
.NET的数据访问有很多选项,分为两类。我在脑海中列出了一个,每个点几个
手动编写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
如何处理结构更改:
Code first
如何处理结构更改:
无论如何我不建议你这样工作,如果你的数据库完全设计得好,然后开始编码就好了。
修改强>
似乎我的答案不再正确,因为实体框架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的迁移。