0
エンティティフレームワークコアでasp.netコアとsqlserverを使用すると、私たちは残りのファイアウォールのエンドポイントを持っています。起動中services.AddDbContext非同期メソッドが使用される前に非同期メソッドで使用されるオブジェクトを破棄します
、我々はフレームワーク
services.AddDbContext<DBContext>(options=>options.UseSqlServer(/*connection string*/));
でDBContextを登録し、当社のコントローラメソッドは
[HttpPost(/*route*/)]
public ObjectResult doWork([FromBody] string[] args)
{
IInjectedLogic.doWorkAsync(args);
return new OkObjectResult("");
}
のようなもので、私たちのロジッククラスは、問題があることである
public interface IInjectedLogic
{
Task doWorkAsync(string[] args);
}
public class InjectedLogic:IInjectedLogic
{
private DBContext ctx;
private ILegacyWCFService wcfClient;
private ILogger logger;
public InjectedLogic(DBContext ctx,ILegacyWCFService wcfClient,ILogger logger)
{
this.ctx=ctx;
this.wcfClient=wcfClient;
this.logger=logger;
}
public async Task doWorkAsync(string[] args)
{
using(var transaction=ctx.Database.BeginTransaction())
{
try
{
string[] processed=await wcfClient.doOtherWorkAsync(args);
}
catch(Exception ex)
{
transaction.RollBack();
logger.logError(ex);
}
transaction.Commit();
}
}
}
のようなものですctx.Database
は、begin transactionが呼び出されると常に破棄されます。私の勘違いは、コントローラが一旦終了するとフレームワークがdisposeを呼び出すことであり、返されたものは範囲外になるということです。
誰かが私の疑惑を確認したり、実際に何が起こっているのかを教えてもらえますか。
あなたがする必要がある*は、すなわち 'injectedLogic.doWorkAsync(引数)を待って、それらが終了するのを待つために*非同期メソッドを待つ;' – poke
ポイントは、私ははしたくないですが完了するのを待ってからok応答を送信します。 –