我是 EF 和数据库设计的新手。我一直在研究如何使用 Repository Pattern 和 Unit of Work,并且看到了很多使用 LINQ 进行的查询。
但我有一个问题。如果将来我们更改数据库的架构,则存储库层必然会发生变化,因为实体本身也会发生变化。换句话说,存储库层与数据库结构紧密耦合。
但是,如果我们使用数据库本身的存储过程封装大部分可能的事务,然后使用 EF 导入它们,那么数据库设计中的更改不会对存储库层产生太大影响。换句话说,层将是这样的:
DATABASE TABLES <---> STORED PROCEDURES <---> EF <---> REPOSITORY <---> APPLICATION LOGIC
为什么我们不遵循这种模式,或者我忽略了任何陷阱?这不是将应用程序与数据库松散地耦合在一起吗?
我认为使用 LINQ 还会将架构与应用程序绑定,这是我关心的问题。如果将来我想进一步规范我的数据库,那就意味着重写整个 LINQ 查询。这是我更喜欢视图而不是显示原始表格的另一个原因。这就像在类中使用属性而不是字段。它增加了一层封装。
我使用 LINQ 创建 DAL。就我个人而言,我觉得使用 LINQ 调试查询要容易得多,而且我不喜欢从 MSSQL 和 VS 中弹跳,所以在某种程度上它也让我的事情变得简单。在过去,我遇到了一些非常讨厌的错误,这些错误需要一段时间才能指出存储过程中的(例如)数据类型错误,而在 VS 调试器上发现此类错误可能需要几分钟时间(也许不会甚至首先编译)。
我确实在查询非常复杂且性能与使用 LINQ 相差甚远的情况下使用存储过程。但这将占任何给定 DAL 类的大约 10%,实际上并没有那么多。
如果你检查一些其他来源,你会发现它主要归结为安全性和性能......还有其他影响,我挖掘重构的论点,但如果你重构你的数据库,你仍然需要重新创建 EF 映射和工作围绕您的存储过程、视图等所做的更改。
有关该主题的更多信息:
Linq2sql 与存储过程
为什么我避免使用存储过程(你也应该这样做)
在这个答案中,有一个关于可读性的论点,从讨论的软件开发方面来看也很有意义: