asp.net ID RTW バージョンを使用します。
UserMananger
関数呼び出しとその他の操作の両方を含む、トランザクションでいくつかのアクションを実行する必要がありますDbContext
(例: 新しいユーザーを作成し、グループに追加し、いくつかのビジネス ロジック操作を実行します)。
どうすればいいですか?
私の考えは続きます。
トランザクションスコープ
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
// Do what I need
if (everythingIsOk) scope.Complete();
}
問題はUserManager
、関数がすべて非同期であり、TransactionScope
async/await で動作するように設計されていないことです。.Net Framework 4.5.1 で解決されたようです。しかし、Azure Web サイトを使用してプロジェクト ビルドをホストしているため、まだ 4.5.1 をターゲットにすることはできません。
データベース トランザクション
public class SomeController : Controller
{
private MyDbContext DbContext { get; set; }
private UserManager<User> UserManager { get; set; }
public AccountController()
{
DbContext = new MyDbContext()
var userStore = new UserStore<IdentityUser>(DbContext);
UserManager = new UserManager<IdentityUser>(userStore);
}
public async ActionResult SomeAction()
{
// UserManager uses the same db context, so they can share db transaction
using (var tran = DbContext.Database.BeginTransaction())
{
try
{
// Do what I need
if (everythingIsOk)
tran.Commit();
else
{
tran.Rollback();
}
}
catch (Exception)
{
tran.Rollback();
}
}
}
}
それはうまくいくようですが、どうすればユニットテストできますか?
UserManager<>
コンストラクターは を受け入れるIUserStore<>
ので、簡単にスタブできます。
UserStore<>
コンストラクターは を受け入れますDbContext
が、これをスタブする方法がわかりません。