【问题标题】:Entity Framework Core Or Normal Sql Command Object实体框架核心或普通 Sql 命令对象
【发布时间】:2019-02-27 14:37:38
【问题描述】:

我必须在 Asp.net 核心中创建一个解决方案,并且我必须使用基于存储过程的方法。那么在应用程序中使用实体框架核心是否可行? 因为数据是从存储过程返回的,而不是Entity Core中声明的对象

【问题讨论】:

  • 基于什么标准?你想做什么?您希望结果如何? SqlCommand 也返回某种类型的对象。 EF Core 也可以返回动态结果。

标签: asp.net asp.net-mvc asp.net-core entity-framework-core


【解决方案1】:

了解需要什么很重要。 Entity Framework & 使用普通 SQl 命令,各有利弊。

基本点是:

实体框架

  1. 如果您的应用程序使用两个或多个数据库,如 SQL server 和 oracle,则可以充当不同数据库的 ORM。几乎可以使用相同的代码。从一个数据库切换到另一个数据库也更容易。

  2. EF 具有代码优先和数据库优先,还维护连接和查询生成,因此更少关注 SQL 注入和更快的更改

  3. 使用 EF 但是,如果您的团队有很多开发人员经常提交 EF 更改,则很难合并 EF 的内部层代码冲突。

  4. 如果您有强大的中间件和缓存,EF 可以针对应用程序缓存进行优化。

SQL 命令对象

  1. 更多地控制 SQL,因为在 EF 中生成的查询在运行时很难分析和优化索引和执行计划。

  2. 需要注意 sql 注入、参数嗅探问题。

  3. 在大型开发团队咨询完成数据库设计之前,代码合并没有问题。

  4. SQL 命令对象在维护中更易于调试和分析,更改工作量更少,因为您无需更新整个 EF 文件和相关代码。

拥有专用 DBA 和大型 DB 服务器的团队选择 SQL 命令,拥有小型敏捷团队、全栈开发和强大中间件的团队通常选择 EF。

它们都适用于某些用例,但都不是万能的。 所以选择最适合你的。

【讨论】:

  • 我们最关心的是与执行相关的应用程序的性能。那么你有什么建议呢?
  • 取决于您的架构、读取次数、并发用户/连接、请求中读取的数据量、所需的连接/索引、插入/更新/删除的频率以及更多因素。一般来说,对于具有复杂连接和并发用户的非连接架构,您可以通过 SQL 命令进行更多控制,因为您可以更好地控制事务、锁、读写并可以更好地优化查询计划
  • 如果您有更多的读取、更少的更新/插入、不太复杂的事务、连接和具有良好的中间件缓存,EF 也可以执行。
【解决方案2】:

EF Core 提供以下方法来执行存储过程:

  1. DbSet<TEntity>.FromSql()

  2. DbContext.Database.ExecuteSqlCommand()

    var data = context.DbSet<TEntity>.FromSql("SPName").ToList();

    var rowsAffected = context.Database.ExecuteSqlCommand("sql command");

更多详情:entityframeworktutorial

对于模型中不存在的使用字段,您可以在模型中声明这些字段并使用NotMapped 属性。 NotMapped Attribute

对于映射存储过程,流利地看看这个link

【讨论】:

  • 感谢您的回答,是的,我知道我可以这样做,但它会返回特定于表的实体。
  • @Hrishikesh 用于映射存储过程看这个解决方案:link
猜你喜欢
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多