如何通过Entity Framework Core调用Cosmos DB存储过程?
EF Core 操作 Cosmos DB 执行存储过程的实现方案
EF Core 官方提供的 Cosmos DB 提供程序目前没有原生封装执行存储过程的上层API,你找不到对应方法是功能边界问题,不是使用方式错误。
目前生产环境可用的实现方式不需要额外单独注入Cosmos客户端,直接从已有的EF Core上下文实例中拿到底层客户端引用即可执行,和Cosmos原生客户端的实现逻辑完全兼容,不会重复占用资源:
// 从已注入的自定义DbContext实例中获取共享的Cosmos客户端 var cosmosClient = dbContext.Database.GetCosmosClient(); // 定位到存储过程所属的目标容器 var targetContainer = cosmosClient.GetContainer( databaseId: "你的Cosmos数据库名称", containerId: "存储过程所在容器名称" ); // 执行存储过程 var executionResult = await targetContainer.Scripts.ExecuteStoredProcedureAsync<自定义返回类型>( storedProcedureId: "你要调用的存储过程ID", partitionKey: new PartitionKey("存储过程执行对应的分区键值"), procedureParameters: new dynamic[] { 传入存储过程的参数1, 参数2 } ); // 读取存储过程返回结果 var resultData = executionResult.Resource;
注意事项
- 不要为了执行存储过程单独注册新的Cosmos客户端实例,
GetCosmosClient()返回的客户端和EF Core上下文内部使用的是同一个实例,共享连接配置、序列化规则,不会产生额外的资源开销 - 调用存储过程时必须传入和操作数据匹配的正确分区键,否则Cosmos会抛出跨分区执行错误
- 如果存储过程没有明确返回值,泛型参数可以传入
object或dynamic占位,不需要定义专门的返回类型 - EF Core 目前没有计划在近期版本中封装存储过程的直接调用API,上述方案是官方推荐的兼容实现方式
内容的提问来源于stack exchange,提问作者Betsq9
相关产品推荐
相关产品推荐

