存储库模式和存储过程

时间:2012-02-17 17:59:28

标签: .net entity-framework stored-procedures repository-pattern

我正在寻找一个使用存储库模式和存储过程的好示例项目。我花了很多次,我找不到任何使用sp与存储库模式和db进行通信的好例子。即使是普通的CRUD,我仍然会使用SP。

另外,有没有人有一个例子来在存储过程中复杂的数据来编码EF?
例如,存储过程返回多个数据表? 感谢

1 个答案:

答案 0 :(得分:3)

  

我找不到任何使用sp进行通信的好例子   存储库模式。即使是普通的CRUD,我仍然会使用SP。

只需考虑pattern和您的选项 - 您只能使用SP,并且您希望对象负责数据访问。您不需要任何示例项目 - 您只需要思考。

使用存储过程实现存储库时,您将以接口定义的简单DAO(数据访问对象)结束,如:

public interface IEntityDao
{
    IEnumerable<Entity> GetAll();
    Entity GetByKey(int key);
    bool Insert(Entity data);
    bool Update(Entity data);
    bool Delete(int key);
}

这是Entity持久化类的CRUD操作的基本界面。每个方法实现都会调用单个存储过程来执行操作。如果您需要任何其他操作(例如某些过滤或排序),您将创建新的存储过程并公开调用此存储过程的新操作。

如果这是或不是存储库,可以讨论,但只是SP不会为您提供更多。例如,这部分定义几乎不可能在通用级别上实现:

  

客户端对象以声明方式构造查询规范并提交   他们到存储库是为了满足。

您的“查询规范”将始终只是特定于给定存储过程的参数,并传递给您的公开操作。您将无法以声明方式定义整个查询(除非您将SQL作为参数传递给SP)。

您可以直接通过ADO.NET调用存储过程,也可以在EF中使用函数导入或ExecuteStoreQuery / ExecuteStoreCommand。 EF能够执行具有以下限制的复杂存储过程:

  • 存储过程仅返回单个结果集。对于多个结果集,您将需要EFExtensions,否则您将不得不等待应包含此功能的.NET 4.5
  • 存储过程不能返回不同的结果集 - 这意味着每个SP执行结果集的结构必须相同(没有枢轴或动态SQL返回不同数量的列)

功能导入几乎没有什么小的限制。如果遵循这些规则,您将能够为SP返回的每个结果集创建类/复杂类型。