我有一个非常简单的服务,该服务创建和实体,并向属性分配字母数字序列,然后将实体持久保存到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>