1

MVC アプリケーションには次のものがあります。

namespace WebUx.Areas.User.Controllers
{
    [Authorize]
    [InitializeSimpleMembership]
    public class AccountController : Controller
    {

プラス:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }

    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            System.Diagnostics.Debug.Write("Set Initializer\n");
            Database.SetInitializer<UsersContext>(null);


            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

            }

アカウントコントローラーへの呼び出しがあると、これによりDBコンテキストが設定されることを理解していますが、これが設定されると、アプリケーションに対して設定されたままになります。後で接続する他のユーザーはどうなりますか。DB コンテキストは常に利用できますか?

私がこれを尋ねている理由は、テーブルに保存して Web API でアクセスしたい他の情報があるからです。これらのコントローラーに同様のコードを記述して、DB コンテキストが利用可能であることを確認するたびに確認する必要がありますか、それともこれを使用できますか?

4

1 に答える 1

1

接続は に密結合されていDbContextます。その結果、接続は、あなたの場合、継承するクラスがそのスコープを保持している場合にのみ開かれDbContextますUsersContext

あなたの例では、ブロックUsersContextにスコープされています。using

using (var context = new UsersContext())
{
 //some actions
}

したがって、「いくつかのアクション」が完了すると、接続が閉じられ、遅延読み込みにアクセスしようとすると、接続が利用できなくなったことを示す例外がスローされます。私の意見では、データベースにアクセスする必要があるたびに、新しい接続を開始する必要があります。確認したいのは、データベースへの実際の移動は 1 回だけであることです。クエリが最適化されていることを確認して、パフォーマンスに影響を与えるため、一度にすべてを実行するのではなく、データベースに複数回アクセスしないようにしてください。

編集

補足として、using ブロックは次のように分割されます。

try{
 var context = new UsersContext();
 //some actions
}finally{
 context.Dispose();
}
于 2013-02-26T09:28:31.123 に答える