在函数调用之间放置MVC Core DbContext

时间:2019-08-24 17:38:37

标签: c# asp.net-core-mvc entity-framework-core dbcontext dispose

我有一个非常简单的服务,该服务创建和实体,并向属性分配字母数字序列,然后将实体持久保存到db。像这样通过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()语句中未使用该上下文时为何要丢弃该上下文,并希望有人可以指出正确的方向。 / p>

0 个答案:

没有答案