【问题标题】:Should I migrate to Entity Framework? [closed]我应该迁移到实体框架吗? [关闭]
【发布时间】:2014-09-06 12:51:11
【问题描述】:

我一直在使用SqlCommand 类并编写自己的 T-SQL 查询已经很长时间了。我坚持使用它是因为我对它感到满意,这可能源于我在我们有许多其他不错的选择之前作为 Windows 开发人员开始的日子。我已经从事 Web 开发大约 10 年了,并且仍在使用它并编写自己的查询字符串。我已经为我所有的数据库需求编写了一个动态类,我所要做的就是编写 T-SQL,我可以快速完成并在任何项目中使用。

其他开发人员看到我的代码后都大开眼界,鼓励我学习我根本不喜欢的 LINQ。

我现在在 ASP.NET MVC 中开始一个新项目,现在我觉得我应该摆脱恐龙时代并转向实体框架来处理我的数据。

我知道SqlCommand 类是幕后实体框架的基本要素,所以我觉得我为什么要通过中间人(实体)来达到相同的结果并花时间学习新的东西.

谁能向我解释为什么我需要继续前进,或者我是否应该坚持我所知道的?

【问题讨论】:

  • 您可能会发现,从长远来看,您可以节省时间并避免并发症。您在 WebForms 或标准 ASP 上使用 MVC 的原因可能与此类似?
  • 我会在示例项目中尝试一下 EF。我很久以前就切换到 EF(使用 .NET 4.0),并且从未回头。 EF 可以为您完成 80% 左右的无聊编码 - 您可以专注于更有趣的部分!
  • 如果您喜欢编写自己的查询并希望在不深入检查的情况下更接近实体框架,请查看Dapper.Net(作为 EF 的替代方案)。

标签: c# entity-framework sqlcommand


【解决方案1】:

改用EF的主要原因是

  • 一旦学会了 EF,开发起来会更快
  • 尤其是连接在大多数情况下更容易编写
  • 编译时检查所有列和表是否确实存在
  • 您可以选择使用 EF 迁移,这是目前最好的数据库迁移工具之一

我几年前切换(通过 Linq2SQL)并且从未回头。

首先使用 EF 代码并使用迁移。

【讨论】:

    【解决方案2】:

    我怀疑只有我一个人有这种看法,但还是这样吧。

    我自己也想了很多。我也是SqlCommand 和 ADO 的人,我希望我至少会再坚持一段时间。

    这确实让我想起了 LinkedIn 上的一个讨论,你可能想看看 here。我敢肯定有很多网站都在谈论这些优势,但也有一些开发者在讨论他们对此事的看法。

    这就是我不得不说的:

    我更喜欢编写自己的数据库访问代码,所以我选择了 ADO.NET 路线。我想有些人可能会因此称我为纯粹主义者(而且不是很好),但我只是喜欢它给我的灵活性。我有完全的控制权,我知道某些东西是否会起作用,如果没有别的,这可以节省查看文档的时间。实际上,我使用我自己编写的一些包装器来做一些类似于实体框架的事情,但同时给了我更多的控制权。不过,它仍然完全建立在 ADO 之上,所以我可以随时进入并更改我想要的任何内容。

    基本上,总的来说,我真的没有太多理由切换。我不认为它会降低代码的可读性(事实上我喜欢冗长的选项)。我喜欢通过编写自己的语句来实现这一点,我可以确定我正在做的事情会奏效,并且我可以将代码直接复制到 SSMS 中,并且完全知道它将在两个地方做完全相同的事情。

    我编写的包装器提供了几个级别的访问权限,我可以直接在其中编写 T-SQL(这里的包装器是我有string.Format-esque、params-style 输入参数的方式),一个建立在我可以直接使用半强类型代码构建不同类型的语句的基础上,以及基于一系列最类似于 EntityFramework 的属性和提示的顶级语句。

    有时我想使用其中的每一个,但我只是觉得受到 EntityFramework 和其他等效系统似乎强制执行的严格限制令人沮丧。我想成为编写代码的人,这样我就知道出了什么问题以及如何解决它。写一个SELECT 并不是真的要花我这么多时间,所以做其他事情不会为我节省太多时间。

    除此之外,正如你所说,SqlCommand 不会很快去任何地方。所以我还没有真正找到任何理由离开完全控制的舒适。

    编辑:

    阅读了其他几个回复后,我想我有一些要补充的。我假设您已经编写了与我所拥有的类似的 ORM,但是如果您为每次拨打的电话写出完整的 SqlCommand 文本并即时投射所有内容,那很可能会给您带来问题。所以我肯定会远离那个。同样,我倾向于喜欢拥有自己的 ORM 来处理我喜欢的事情(我想一个很好的例子是,例如,如果这是应用程序需要的,我会自动解析 XElement,或者我会将 Sql Spatial 数据更改为更易于管理的数据),但如果您在两者之间做出选择,则绝对应该切换到 EF,并不断写出进行 ADO 调用所涉及的每一行。这样做弊大于利。

    编辑 2:

    我想要记住的另一件重要事情是,如果您编写自己的 ORM,则必须将数据库结构与对象模型绑定。 EF 将使所有内容保持同步,这很好,但我仍然希望对所有内容拥有更多控制权,而且我不介意自己做这项工作。

    【讨论】:

    • 我很好奇,你的包装器是否创建了准备好的语句,以便它们被预编译,并且不容易被 sql 注入?
    • 是的。即使对于我的最低级别包装器,它接受纯 T-SQL 的包装器也具有可以像这样使用的函数,ExecuteNonQuery("SELECT * FROM tablename WHERE username = @p0", tbUsername.Text);。这显然是一个完全虚构的例子,但它显示了语法。基本上,我通过“@p{index}”的命名约定为传入的每个对象添加参数。这使得参数化超级容易。正如我简要提到的,它与string.Format 并没有太大的不同,当然使用我自己的分隔符会使它们更加兼容。
    【解决方案3】:

    多年来,我一直在使用 NHibernate、EntityFramewrk、LinqToSQL 和裸 SQLCommand。 ORM 的生成命令的质量和所需的开销各不相同,但它们为您的 sql 命令提供了简单性和类型安全性。如果您将 sql 编写为字符串,您将不会拥有它。很高兴了解它们,因为它们是快速开发中小型应用程序的绝佳工具,在我看来,它们在大型和复杂的环境中会失败。

    最近我们开始了一个新项目,并决定使用普通的旧 SQLCommand 和我们自己的 Linq 到 SQL 转换器。它对简单查询很有用,我们可以回退到专用代码来处理更复杂的查询。另一件事是我们喜欢完全控制我们的数据库,在我看来,我们在使用 ORM 时会放松这一点。

    【讨论】:

    • 如果您使用 ORM,我看不到您如何无法完全控制您的数据库。您不需要让 ORM 为您生成数据库。我从来没有这样做过。我总是先创建数据库,然后将 ORM 映射到它。
    • @ErikFunkenbusch 是的,这是一个选项,但我所说的数据库不仅是创建或更新,还包括视图、存储过程和函数,与从 orm 和.net 中的处理逻辑。如果我没记错的话,EF 可以映射视图并从版本 6 调用存储过程,这对他们来说是新的。
    • 不,EF 始终能够调用存储过程并将结果映射回对象。 6 中的新功能是能够使用存储过程来支持更新和删除的映射更改。但同样,我不明白这与你的数据库的“控制”有什么关系。
    【解决方案4】:

    嗯,使用 SqlCommand...如果你做得对,你要么已经编写了 ORM 的等价物,要么你正在花费大量时间编写代码来执行诸如打包参数和映射之类的操作列到对象。如果您没有执行其中任何一项,那么您的代码可能不安全,并且正在传递无类型的 DataSet,然后进行大量强制转换,或者您正在执行易于发生 SQL 注入的危险连接 SQL 查询。

    使用 EF(或任何 ORM)的优势在于它可以处理 SQL 生成、对象映射、参数打包,并为您提供非常强大的查询接口,让您可以非常快速地编写多个查询。

    既然可以写 1 行代码,为什么还要写 10 行代码?

    您是否使用 EF 确实是个人选择...但如果您正在做严肃的面向对象开发,您应该使用某种类型的 ORM(甚至可能是微型 ORM,如 dapper 或 mass) .或者为此编写自己的微规范。

    在没有某种自动映射技术的情况下使用 ADO 只是一个巨大的痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多