ASP.Net Core Web API 和 Entity Framework 使用存储过程有什么好处吗?
ASP.Net Core Web API with Entity Framework is there any benefit to using stored procedures?
我有一个 SQL 服务器数据库,我正在使用 ASP.Net 核心 Web API 使用 Entity Framework 访问它。以下是同一查询的 2 个示例,其中 1 个使用默认查询方法,第二个使用存储过程。
默认网站API查询
// GET: api/Players
[HttpGet]
public async Task<ActionResult<IEnumerable<Player>>> GetPlayers()
{
return await _context.Players.ToListAsync();
}
使用存储过程
// GET: api/Players
[HttpGet]
public async Task<ActionResult<IEnumerable<Player>>> GetPlayersProc()
{
string storedProc = "exec GetAllPlayers";
return await _context.Players.FromSqlRaw(storedProc).ToListAsync();
}
这两个 return 完全相同的玩家列表。
我的问题是使用一种方法比另一种方法有什么好处?以任何方式使用存储过程是否更快或更安全?两种方法的优缺点是什么?
EF 提供对数据库的强类型访问,因此您可以对每个查询进行编译时检查。这会以较小的性能成本为代价。
当您使用存储过程时,EF 结构和查询之间存在断开连接,如果您的存储过程不正确,那么您可能要到运行时才能知道。但是,是的,您可以使用 SP 提高性能,但这是以维护工作为代价的。
通常,SP 保留在 EF 项目中,用于 SP 预先存在的场景,或者您需要 Uber 性能,或者正在做一些复杂的事情,SQL 引擎已优化支持但很难做到用 C# 表示。
在单独的 DBA 团队管理数据库和访问数据库以及您的应用程序代码需要符合他们的控制的情况下,SP 也被大量使用。
SP 在 EF 项目中通常是一个不必要的抽象层,尤其是当您使用代码优先范式并且也在您的解决方案中管理架构时。
在证明合理之前,不要尝试预先优化您的应用程序。为特殊场合保存 SP。
SP 除了返回数据集结果外还能做更多,- 如果您需要 - 可以被认为是一个优势。
在这种简单的情况下,可能没有这样的优势,相反:您花时间创建了一个包含 SQL 代码的 SP,该代码可能与 EF 即时生成的代码非常相似。每次更新模型时,您都必须确保所有 SP 仍然正确。
也许更重要的是,SP 可以被授予查询表的访问权限,而对于普通查询,这些权限可能会被锁定,这意味着如果某人(员工或黑客)具有访问权限对于应用了此类限制的数据库,则它们无法 运行 随意查询,它们只能执行可用的 SP。这仅适用于您 and/or DBA 认为需要这种安全性并且值得花时间和精力去做的情况。您需要为每个查询场景编写专用 SP,使它们与模型更改保持同步,并在每次发布时将它们部署到服务器。需要权衡优势(更好的安全性)与额外的努力。
我有一个 SQL 服务器数据库,我正在使用 ASP.Net 核心 Web API 使用 Entity Framework 访问它。以下是同一查询的 2 个示例,其中 1 个使用默认查询方法,第二个使用存储过程。
默认网站API查询
// GET: api/Players
[HttpGet]
public async Task<ActionResult<IEnumerable<Player>>> GetPlayers()
{
return await _context.Players.ToListAsync();
}
使用存储过程
// GET: api/Players
[HttpGet]
public async Task<ActionResult<IEnumerable<Player>>> GetPlayersProc()
{
string storedProc = "exec GetAllPlayers";
return await _context.Players.FromSqlRaw(storedProc).ToListAsync();
}
这两个 return 完全相同的玩家列表。
我的问题是使用一种方法比另一种方法有什么好处?以任何方式使用存储过程是否更快或更安全?两种方法的优缺点是什么?
EF 提供对数据库的强类型访问,因此您可以对每个查询进行编译时检查。这会以较小的性能成本为代价。
当您使用存储过程时,EF 结构和查询之间存在断开连接,如果您的存储过程不正确,那么您可能要到运行时才能知道。但是,是的,您可以使用 SP 提高性能,但这是以维护工作为代价的。
通常,SP 保留在 EF 项目中,用于 SP 预先存在的场景,或者您需要 Uber 性能,或者正在做一些复杂的事情,SQL 引擎已优化支持但很难做到用 C# 表示。
在单独的 DBA 团队管理数据库和访问数据库以及您的应用程序代码需要符合他们的控制的情况下,SP 也被大量使用。
SP 在 EF 项目中通常是一个不必要的抽象层,尤其是当您使用代码优先范式并且也在您的解决方案中管理架构时。
在证明合理之前,不要尝试预先优化您的应用程序。为特殊场合保存 SP。
SP 除了返回数据集结果外还能做更多,- 如果您需要 - 可以被认为是一个优势。
在这种简单的情况下,可能没有这样的优势,相反:您花时间创建了一个包含 SQL 代码的 SP,该代码可能与 EF 即时生成的代码非常相似。每次更新模型时,您都必须确保所有 SP 仍然正确。
也许更重要的是,SP 可以被授予查询表的访问权限,而对于普通查询,这些权限可能会被锁定,这意味着如果某人(员工或黑客)具有访问权限对于应用了此类限制的数据库,则它们无法 运行 随意查询,它们只能执行可用的 SP。这仅适用于您 and/or DBA 认为需要这种安全性并且值得花时间和精力去做的情况。您需要为每个查询场景编写专用 SP,使它们与模型更改保持同步,并在每次发布时将它们部署到服务器。需要权衡优势(更好的安全性)与额外的努力。