C# 无法从Blazor应用程序中的Register.cshtml.cs执行SQL Server存储过程

C# 无法从Blazor应用程序中的Register.cshtml.cs执行SQL Server存储过程,c#,stored-procedures,asp.net-identity,blazor,C#,Stored Procedures,Asp.net Identity,Blazor,我在SQL Server数据库中有一个Players表,我正在尝试在注册期间使用存储过程将其链接到AspNetUsers表。但是,当我尝试调用该过程时,该变量p为null。我是这种编码的新手,所以在回复时请记住这一点 下面是Register.cshtml.cs文件中变量p为null的部分- readonly PlayerInitClass p; public async Task<IActionResult> OnPostAsync(string returnUrl = null)

我在SQL Server数据库中有一个
Players
表,我正在尝试在注册期间使用存储过程将其链接到
AspNetUsers
表。但是,当我尝试调用该过程时,该变量p为null。我是这种编码的新手,所以在回复时请记住这一点

下面是Register.cshtml.cs文件中变量p为null的部分-

readonly PlayerInitClass p;

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
        returnUrl = returnUrl ?? Url.Content("~/");
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

        if (ModelState.IsValid)
        {
            var user = new ApplicationIdentityUser { UserName = Input.Email, Email = Input.Email };
            var result = await _userManager.CreateAsync(user, Input.Password);
            int pID = await p.InitPlayerAsync(user);
        }
}
readonly playerinitp类;
公共异步任务OnPostAsync(字符串returnUrl=null)
{
returnUrl=returnUrl??Url.Content(“~/”);
ExternalLogins=(wait _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if(ModelState.IsValid)
{
var user=newapplicationidentityuser{UserName=Input.Email,Email=Input.Email};
var result=await\u userManager.CreateAsync(用户,输入,密码);
int pID=等待p.InitPlayerAsync(用户);
}
}
这是我创建的类-

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Scorekeeper.Data;

namespace Scorekeeper.Areas.Identity
{
    public class PlayerInitClass
    {
        private readonly ApplicationDbContext _db;

        public PlayerInitClass(ApplicationDbContext db)
        {
            _db = db;
        }

        public async Task<Int32> InitPlayerAsync(ApplicationIdentityUser user)
        {
            int AspNetUserId = user.Id;

            SqlParameter[] @params =
            {
              new SqlParameter("@returnVal", SqlDbType.Int) {Direction = ParameterDirection.Output},
              new SqlParameter("@AspNetUserId", SqlDbType.Int) {Direction = ParameterDirection.Input, Value = AspNetUserId},
          };

            await _db.Database.ExecuteSqlRawAsync("EXEC @returnVal=[dbo].[InitializeNewRegistrationPlayer] @AspNetUserId", @params);

            int result = Convert.ToInt32(@params[0].Value);

            await Task.FromResult(result);
            return result;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.Data.SqlClient;
使用Microsoft.EntityFrameworkCore;
使用记分员。数据;
命名空间Scorekeeper.Areas.Identity
{
公共课PlayerInitClass
{
私有只读应用程序dbContext_db;
public PlayerInitClass(ApplicationDbContext数据库)
{
_db=db;
}
公共异步任务initPlayerSync(ApplicationIdentityUser用户)
{
int AspNetUserId=user.Id;
SqlParameter[]@params=
{
新的SqlParameter(“@returnVal”,SqlDbType.Int){Direction=ParameterDirection.Output},
新的SqlParameter(“@AspNetUserId”,SqlDbType.Int){Direction=ParameterDirection.Input,Value=AspNetUserId},
};
wait _db.Database.executeSqlRawaAsync(“EXEC@returnVal=[dbo].[InitializenerRegistrationPlayer]@AspNetUserId”,@params);
int result=Convert.ToInt32(@params[0].Value);
等待任务。FromResult(结果);
返回结果;
}
}
}
这是我看到的关于字段p为null的警告消息


我最终找到了一种不为null的方法。正如你可能已经知道的那样,我是一个新手,并且盲目地在这个过程中跌跌撞撞。话虽如此,说这是这个问题的“正确”答案,我会感到不自在。而且,即使我让它不为null,它现在也会抛出一个不同的错误。如果我想不出来,我会另发一个问题

以下是我将PlayerInitClass更改为:

public class PlayerInitClass : Microsoft.EntityFrameworkCore.DbContext
{
public PlayerInitClass()
{
    this.context = context;
}

public PlayerInitClass context { get; set; }
这就是我实例化它的方式(不确定这样说是否正确):


嗯,这个警告很清楚:……从来没有分配给。所以把它分配到某个地方,我不知道怎么做。你能给我举个例子吗?PlayerInitClass p=new PlayerInitClass();谢谢你,丹,我想我快到了。现在,它希望我为ApplicationDbContext传递一个值。我不知道括号里该放什么。PlayerInitClass p=新的PlayerInitClass();错误CS7036未给出与“PlayerInitClass.PlayerInitClass(ApplicationDbContext)”的必需形式参数“db”相对应的参数@dfwdba编辑包含答案的问题不是堆栈溢出如何工作。如果你找到了一个解决方案,回答你自己的问题是可以的。将答案复制到“答案”中,然后编辑您的问题以删除其中的答案
PlayerInitClass p = new PlayerInitClass();