首页 > 解决方案 > MVC Core DbContext 设置在函数调用之间

问题描述

我有一个非常简单的服务,它创建实体并将字母数字序列分配给属性,然后将实体持久保存到数据库。上下文通过 MVC Core 依赖注入注入到服务中,就像这样。

// Configure DB context
        var connectionString = Configuration.GetConnectionString("DefaultConnection");
        services.AddDbContext<MyDataContext>(opt => opt.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationAssembly)));

上下文在服务构造函数中通过

public MyService(MyDataContext myDataContext)
{
    this.myDataContext = myDataContext;   
}

执行插入的逻辑如下

public async Task  GenerateRecord()
 {
    // Init the entity
    var myEntity = new myEntity
    {
        Id = Guid.NewGuid(),
        DateCreated = DateTime.Now,
        Sequence = await GetSequence();
    };

     myDataContext.MyEntities.Add(myEntity);
     myDataContext.SaveChanges();

 }

生成序列的逻辑是

private async Task<string> GetSequence()
{

    DbCommand cmd = myDataContext.Database.GetDbConnection().CreateCommand();
    cmd.CommandText = "dbo.fnGetAlphaNumSeqID";
    cmd.CommandType = CommandType.StoredProcedure;
    DbParameter param = cmd.CreateParameter();
    param.Value = "";
    param.DbType = DbType.String;
    param.Size = 100;
    param.Direction = ParameterDirection.Output;
    param.ParameterName = "@ReturnSequence";
    cmd.Parameters.Add(param);

    if (cmd.Connection.State != ConnectionState.Open)
    {
        cmd.Connection.Open();
    }
    await cmd.ExecuteNonQueryAsync();

    var newId = param.Value.ToString();

    return newId;

}

我遇到的问题是,在调用ExecuteNonQueryAsync上下文之后。我正在等待函数中唯一的异步调用,并且正在返回async Task而不是async void. 我目前无法确定使此成功的适当方法,或者为什么在using()声明中未使用上下文时要处理上下文,并希望有人能指出我正确的方向。

标签: c#asp.net-core-mvcentity-framework-coredbcontextdispose

解决方案


推荐阅读