Asp.net 如何首先或之后将存储过程映射到EF 6.1.1代码?

Asp.net 如何首先或之后将存储过程映射到EF 6.1.1代码?,asp.net,entity-framework,Asp.net,Entity Framework,我一直在使用以下代码在我的C#控制器中执行一个存储过程。db是我的EF数据库上下文 var sql = @"dbo.sp_add_test @CreatedBy, @CreatedDate, @TestId, @TestStatusId"; List<SqlParameter> parameterList

我一直在使用以下代码在我的C#控制器中执行一个存储过程。db是我的EF数据库上下文

var sql = @"dbo.sp_add_test  @CreatedBy,
                             @CreatedDate,
                             @TestId,
                             @TestStatusId";   
List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@CreatedBy", Int32.Parse(User.Identity.GetUserId()) ));
parameterList.Add(new SqlParameter("@CreatedDate", DateTime.UtcNow));
parameterList.Add(new SqlParameter("@TestId", testId));
parameterList.Add(new SqlParameter("@TestStatusId", 3));
SqlParameter[] parameters = parameterList.ToArray();


var test = await db.Database.SqlQuery<Test>(sql, parameters).FirstOrDefaultAsync();
var sql=@“dbo.sp_add_test@CreatedBy,
@创建日期,
@睾丸,
@TestStatusId”;
列表参数List=新列表();
Add(新的SqlParameter(“@CreatedBy”,Int32.Parse(User.Identity.GetUserId()));
Add(新的SqlParameter(“@CreatedDate”,DateTime.UtcNow));
parameterList.Add(新的SqlParameter(“@TestId”,TestId));
parameterList.Add(新的SqlParameter(“@TestStatusId”,3));
SqlParameter[]parameters=parameterList.ToArray();
var test=await db.Database.SqlQuery(sql,参数).FirstOrDefaultAsync();
我曾经有过这样的建议:“为什么不把你的SP映射到EF环境中呢?”然而,当我对此进行研究时,我发现如何进行这项工作还不清楚。首先,我看到了一个nuget软件包:

但我不清楚。这是唯一的方法吗?还是有什么改变了。我在互联网上看到帖子,但最近情况似乎有所变化,所以我认为这些帖子可能已经过时了


有人能告诉我EF 6.1.1现在是怎么做的吗。请注意,我正在寻找只使用Microsoft工具的官方方法。另请注意,我先使用代码,因此无法使用edmx映射器等。

这似乎是一个insert函数,Entity Framework 6.1本机支持该函数。有关其工作原理的信息,请参阅

本质上,您可以使用fluent API将实体映射到存储过程,而不是默认的插入/更新/删除查询。例如:

modelBuilder
    .Entity<Test>()
    .MapToStoredProcedures (s =>
        s.Insert(i => i.HasName("sp_add_test")
            .Parameter(t => t.CreatedBy, "CreatedBy")
            .Parameter(t => t.CreatedDate, "CreatedDate")
            .Parameter(t => t.TestId, "TestId")
            .Parameter(t => t.TestStatusId, "TestStatusId")));
modelBuilder
.实体()
.MapToStoredProcess(s=>
s、 插入(i=>i.HasName(“sp\U添加\U测试”)
.Parameter(t=>t.CreatedBy,“CreatedBy”)
.Parameter(t=>t.CreatedDate,“CreatedDate”)
.Parameter(t=>t.TestId,“TestId”)
.Parameter(t=>t.TestStatusId,“TestStatusId”);
请注意:

限制

  • 存储过程映射目前只能使用Fluent API完成。将来,我们可能会考虑一种基于属性(数据注释)的替代方案
  • 对于给定实体(或实体层次结构),不能混合使用存储过程和直接表访问。插入、更新和删除操作都必须使用直接表访问或存储过程
      官方不支持。您可以使用由EF团队成员之一编写的附加组件,如帖子中所链接的,但仅此而已


      您也可以使用工具来实现这一点(比如LLBLGen Pro,它可以在DbContext类中为您创建过程调用映射:),但不允许这样做,因为您只需要官方工具。我想说的是:官方工具在很多方面都很糟糕,所以如果你只想为这个和其他与EF相关的东西寻找官方工具,那你就要经历一段地狱般的旅程了;)

      这些是扩展,但是可以很容易地迁移到从DBContext类继承的主类之外的方法

      下面是我的所有存储过程/函数方法都包含的3个通用签名

          public static IEnumerable<T> ExecuteSProc<T> ( this DbContext ctx , string schema , string sproc , params SqlParameter[] para ) {
              return ctx.Database.SqlQuery<T>( "Execute " + schema + "." + sproc , para ).ToArray();
          }
          public static T ExecuteSProcSingle<T> ( this DbContext ctx , string schema , string sproc , params SqlParameter[] para ) {
              return ctx.Database.SqlQuery<T>( "Execute " + schema + "." + sproc , para ).SingleOrDefault();
          }
      
          public static int ExecuteSProc ( this DbContext ctx , string schema , string sproc , params SqlParameter[] para ) {
              return ctx.Database.ExecuteSqlCommand( "Execute " + schema + "." + sproc , para );
          }
      
      公共静态IEnumerable ExecuteSProc(此DbContext ctx、字符串架构、字符串存储过程、参数SqlParameter[]para){
      返回ctx.Database.SqlQuery(“执行”+schema+“+sproc,para).ToArray();
      }
      公共静态T ExecuteSProcSingle(此DbContext ctx、字符串架构、字符串存储过程、参数SqlParameter[]para){
      返回ctx.Database.SqlQuery(“Execute”+schema+“+sproc,para).SingleOrDefault();
      }
      public static int ExecuteSProc(此DbContext ctx、字符串架构、字符串存储过程、参数SqlParameter[]para){
      返回ctx.Database.ExecuteSqlCommand(“Execute”+schema+”+sproc,para);
      }
      
      我会定期将我在几篇文章中总结的一些小怪癖发布到一个独特的实现概念中:

      大局,你会问:

      public static class DbContextExtension {
          public static IEnumerable<T> ExecuteSProc<T> ( this DbContext ctx , string schema , string sproc , params SqlParameter[] para ) {
              return ctx.Database.SqlQuery<T>( "Execute " + schema + "." + sproc , para ).ToArray();
          }
          public static T ExecuteSProcSingle<T> ( this DbContext ctx , string schema , string sproc , params SqlParameter[] para ) {
              return ctx.Database.SqlQuery<T>( "Execute " + schema + "." + sproc , para ).SingleOrDefault();
          }
      
          public static int ExecuteSProc ( this DbContext ctx , string schema , string sproc , params SqlParameter[] para ) {
              return ctx.Database.ExecuteSqlCommand( "Execute " + schema + "." + sproc , para );
          }
      }
      
      公共静态类dbcontextension{
      公共静态IEnumerable ExecuteSProc(此DbContext ctx、字符串架构、字符串存储过程、参数SqlParameter[]para){
      返回ctx.Database.SqlQuery(“执行”+schema+“+sproc,para).ToArray();
      }
      公共静态T ExecuteSProcSingle(此DbContext ctx、字符串架构、字符串存储过程、参数SqlParameter[]para){
      返回ctx.Database.SqlQuery(“Execute”+schema+“+sproc,para).SingleOrDefault();
      }
      public static int ExecuteSProc(此DbContext ctx、字符串架构、字符串存储过程、参数SqlParameter[]para){
      返回ctx.Database.ExecuteSqlCommand(“Execute”+schema+”+sproc,para);
      }
      }
      
      这是为实体持久性操作映射的过程,而不是可以返回结果集的一般过程。如果是,我只是从名称和参数列表推断这可能是一个插入过程。您不太可能使用
      CreatedDate
      作为
      DateTime来搜索数据库。现在
      ,但问题本身并不完全清楚。此上下文不正确的Fluent API具有执行存储过程和函数的能力和功能。可以直接在DBContext之外或通过ModelBuilder完成。