实体框架核心存储过程

GSH*_*GSH 3 stored-procedures entity-framework-core

我正在使用EF Core(代码优先),并希望从存储过程中获取数据.返回的结果应该是我根据结果返回定义的类.

如果返回类型是实体之一,我可以使它工作.恩.

_context.Set<Entity>().FromSql("dbo.Stored_Proc").ToList(); 
Run Code Online (Sandbox Code Playgroud)

但如果我的返回值不是上下文中的实体,则不会.

任何帮助,将不胜感激.

小智 6

这很容易.

这有3个步骤:

  1. 创建具有SP返回的相同属性的模型类,例如

    public class SPModel
    {
      public int Id {get;set;}
      public DateTime? CreatedDateTime {get;set;}
      etc..
    }

  1. 将此模型类插入dbContext类,如:

    public class YourDbContext: DbContext
    {
       public virtual DbSet<SPModel> YourDbSet { get; set; }
       ....
    }

不要将此类映射到任何sql表

  1. 用它来调用SP,如:
 
    var collection = await dbContext.YourDbSet.FromSql("EXECUTE yourStoredProcedure {0},{1}", param1, param2).ToListAsync();

一些有用的东西:
- 您可以使用try/catch块来查看是否遗漏了一些属性
- 您可以扩展模型类以添加新属性,但避免使用"set"访问器:public bool IsLoaded {get;}
- 小心如果你的SP返回一些可以为空的类型,在这种情况下,模型也必须具有可空类型