EF 7中调用存储过程遇MapToStoredProcedures未识别问题求助
问题原因与解决办法
EF 7(即EF Core 7)中不存在MapToStoredProcedures()方法,这个API是Entity Framework 6专属的,EF Core系列(包括EF7)已经用全新的方式处理存储过程相关配置。结合你的场景(调用返回多表数据的存储过程并映射到模型),按以下方式调整即可:
1. 针对读取存储过程数据的场景(你的核心需求)
如果只是要读取存储过程返回的多表数据并映射到Inventory模型,不需要配置实体到存储过程的映射,直接调用即可:
- 方式一:使用
Database.SqlQuery<T>(无需将Inventory注册为DbSet)var command = "EXEC YourStoredProcedureName"; // 替换为你的存储过程调用语句,可带参数 var result = await _context.Database.SqlQuery<Inventory>(command).ToListAsync(); - 方式二:使用DbSet结合
FromSqlRaw(需注册DbSet)
先确保Inventory被配置为无键实体(因为它不是数据库中实际存在的表,EF Core默认要求实体有主键):
然后调用存储过程:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Inventory>().HasNoKey(); }var result = await _context.Inventorys.FromSqlRaw("EXEC YourStoredProcedureName").ToListAsync();
2. 若需配置实体CRUD使用存储过程(非当前需求,仅作补充)
如果你的需求是让Inventory实体的新增/更新/删除操作对应调用存储过程,EF Core 7的配置方式如下:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Inventory>() .InsertUsingStoredProcedure(sp => sp .HasName("InsertInventory") .Parameter(p => p.location, "LocationParam") .Parameter(p => p.Warehouse, "WarehouseParam")) .UpdateUsingStoredProcedure(sp => sp .HasName("UpdateInventory") .Parameter(p => p.location, "LocationParam")) .DeleteUsingStoredProcedure(sp => sp .HasName("DeleteInventory") .Parameter(p => p.Item, "ItemParam")); }
内容的提问来源于stack exchange,提问作者Kurubaran
相关产品推荐
相关产品推荐

