C# 和 .NET 的“最佳”数据访问框架/方法是什么?

2024-04-29

(编辑:我将其设为社区维基,因为它更适合协作格式。)

有多种方法可以从 .NET 访问 SQL Server 和其他数据库。一切都有其优点和缺点,这永远不会是一个简单的问题,哪个是“最好的” - 答案永远是“这取决于”。

然而,我正在寻找在不同级别的系统背景下对不同方法和框架进行高层次比较。例如,我想象对于一个快速而肮脏的 Web 2.0 应用程序,答案将与内部企业级 CRUD 应用程序非常不同。

我知道 Stack Overflow 上有很多涉及这个问题子集的问题,但我认为尝试建立一个总结比较是有用的。我将尽力通过更正和澄清来更新问题。

到目前为止,这是我的高层次理解 - 但我确信这是错误的...... 我主要关注 Microsoft 保持这一重点的方法。

ADO.NET 实体框架 http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework

  • 与数据库无关
  • 很好,因为它允许交换后端
  • 不好,因为它会影响性能并且数据库供应商对此不太满意
  • 似乎是MS未来的首选路线
  • 学习起来很复杂(尽管如此,请参阅267357 https://stackoverflow.com/questions/267357/how-is-the-net-entity-framework-overkill-versus-linqtosql)
  • 它是通过以下方式访问的实体的 LINQ http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework#LINQ_to_Entitiesso 提供了 ORM,从而允许在代码中进行抽象

LINQ 到 SQL http://en.wikipedia.org/wiki/Language_Integrated_Query#LINQ_to_SQL

  • 不确定的未来(参见LINQ to SQL 真的死了吗? http://www.infoq.com/news/2008/11/DLINQ-Future)
  • 简单易学 (?)
  • 仅适用于 MS SQL Server
  • 也可以看看LINQ 的优点和缺点 https://stackoverflow.com/questions/271384/pros-and-cons-of-linq-language-integrated-query

“标准”ADO.NET

  • No ORM
  • 没有抽象,因此您可以“自己动手”并使用动态生成的 SQL
  • 直接访问,可以实现更好的性能
  • 这与关于是否关注对象或关系数据的古老争论有关,答案当然是“这取决于大部分工作在哪里”,因为这是一个无法回答的问题,希望我们不会必须深入探讨这一点。恕我直言,如果您的应用程序主要操作大量数据,那么将其过多抽象为前端代码中的对象是没有意义的,您最好使用存储过程和动态 SQL 来完成尽可能多的工作可能在后端。然而,如果您主要进行导致数十或数百行级别的数据库交互的用户交互,那么 ORM 就完全有意义了。因此,我想我对老式 ADO.NET 的看法是在操作和修改大型数据集的情况下,在这种情况下,您将受益于对后端的直接访问。
  • 当然,另一种情况是您必须访问已由存储过程保护的旧数据库。

ASP.NET 数据源控件

这些是完全不同的东西还是只是标准 ADO.NET 的一层? - 如果您有 DAL 或者实现了 LINQ 或实体,您真的会使用这些吗?

NHibernate

  • 看起来是一个很厉害很强大的ORM?
  • 开源

其他一些相关链接;NHibernate 或 LINQ to SQL https://stackoverflow.com/questions/53417/nhibernate-or-linq-to-sql 实体框架与 LINQ to SQL https://stackoverflow.com/questions/8676/entity-framework-vs-linq-to-sql


我认为 LINQ to SQL 非常适合针对 SQL Server 的项目。

如果我们针对不同的数据库,ADO.NET 实体框架会更好。目前我认为很多提供程序可用于 ADO.NET 实体框架、PostgreSQL、MySQL、esql、Oracle 等许多提供程序(检查http://blogs.msdn.com/adonet/default.aspx http://blogs.msdn.com/adonet/default.aspx).

我不想再使用标准 ADO.NET,因为这是浪费时间。我总是选择 ORM。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 和 .NET 的“最佳”数据访问框架/方法是什么? 的相关文章

  • 选定的非聚合值必须是关联组的一部分

    我在 Teradata 中有两个表 Table A 和 Table B 它们之间是 LEFT JOIN 之后我将创建 SELECT 语句 其中包含两个表中的属性 SELECT attribute 1 attribute 2 attribut
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • 如何在sql server中对行号进行内连接

    SQL Server 2008 两张表 表A有以下数据 RowA RowB RowC RowD 表B有以下数据 Row4 Row3 Row2 Row1 我想得到以下输出 RowA Row1 RowB Row2 RowC Row3 RowD
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 表达与空列表相同的 IN 条件的可移植方式是什么?

    例如 工作于sqllite3 select from orders where custid and status in 但它失败了postgres ksysdb select code applicable objecttype from
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • ASP.NET Core 会话超时

    我记得我们在 ASP NET 中使用了 session timeout 来更改会话超时 如果不更改 则为 20 分钟 我尝试在 Startup cs 中更改 ASP NET Core 3 1 中的会话超时 但没有任何反应 我对操作员使用身份

随机推荐