web-dev-qa-db-ja.com

新しいASP.NET MVC 5アプリケーションは、データベースを作成する方法と、アカウントコントローラーがデータベースにアクセスする方法をどのように知っていますか?

ASP.NET MVC 5アプリケーションを作成しましたVisual Studio 2013 Update 2アプリケーションには、アカウントコントローラーがあります。私が慣れているものとは異なり、dbcontextのインスタンス化は含まれていません。

public class AccountController : Controller
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

    public ApplicationUserManager UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

僕の web.configデフォルトで作成される接続文字列には、次のようなものがあります。

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf;Initial Catalog=aspnet-WebApplication3-20140417072624;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

初めて起動したときに、このアプリケーションのデータベースを作成するためにアプリケーションがどのように知っているかを誰かに説明できますか?

また、その後の起動時に、Entity Frameworkを使用してIDテーブルにアクセスして認証を行いますか?

34
user1943020

1)ここで何が起こっているのか:

新しいMVC 5アプリケーションを作成し、「個人ユーザーアカウント」を選択すると、新しいASP.NET Identity Providerが含まれ、Entity Framework 6 Code-First

Microsoftは、EF-Code-Firstを採用して、Identityを可能な限りカスタマイズ可能にしました。

Identityに初めてアクセスするとき、Entity Frameworkは、データベースが存在するかどうかを確認します。特に設定されていない限り、"DefaultConnection"を使用してIDデータベースを検索します。 Identityが呼び出されたときにデータベースが存在しない場合、[〜#〜] ef [〜#〜]が自動的にデータベースを作成しました。

接続文字列に含まれていることに注意してください

`AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf`

App_Dataフォルダーを開くと、aspnet-WebApplication3-20140417072624.mdfファイルが必要です。 。

この.mdfファイルをダブルクリックすると、VS2013 Server ExplorerがDBを開きます。すでにIdentity機能にアクセスしようとしている場合は、次のテーブルが作成されます。

  • _ MigrationHistory
  • ASPNetRoles
  • ASPNetUserClaims
  • ASPNetUserLogins
  • ASPNetUsers

デフォルトでは、アプリはSQL Server Compact(MDFファイル)を使用するように構成されているため、実際のSQL Serverインスタンス実行中。これらはすべてカスタマイズ可能です。 MDFファイル、Identity Databaseのスキーマ、SQL Compact vsの選択)の名前実際のSQL Serverインスタンス接続文字列を変更するか、新しい接続文字列を作成して、この新しい接続をコンテキストに渡します。


2)WHERE IS MY CONTEXT?

これはすべて良好ですが、あなたが尋ねた重要な質問は基本的に「 Where is my context?」と、DBをさらにカスタマイズする方法に関する関連する暗黙の質問です。検証ロジックを変更します。

プロジェクトがMicrosoft.AspNet.Identity.EntityFrameworkを参照していることに気付くでしょう。このアセンブリは、IdentityDBContext<TUser>の実装であり、UserManagerクラスの実装です。

AccountControllerを開き、コンストラクターにUserManagerオブジェクトが渡され、さらにnew UserStoreオブジェクトが渡されることに注意してください。 ApplicationDbContextが渡されます。

    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

ApplicationDbContextは、 Models フォルダーで定義されます。そのフォルダー内に、IdentityModels.csファイルがあります。それを開くと表示されます

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

これは、IDコンテキストが割り当てられる場所です。 ApplicationDbContextコンストラクターに渡される接続名を変更するか、アカウントコントローラーで別のコンテキストを定義して使用できます。


3)IDスキーマをカスタマイズするにはどうすればよいですか?

IN IdentityModels.csファイルで定義されている別のクラスは、ApplicationUserクラスを継承するIdentityUserクラスです。

public class ApplicationUser : IdentityUser
{
}

このクラスに追加するプロパティは、ASPNetUsers Tableに保持されます。残りのスキーマは、IdentityDbContextクラスで定義されます。したがって、コンテキスト定義にDBSetを追加することにより、IDスキーマにさらにテーブル(特権など)を追加できますが、

public DBSet<Privileges> { get; set; }

他のテーブル(ロール、クレームなど)を変更することもできますが、はるかに複雑です。たとえば、 Roles テーブルをカスタマイズするには、NewIdentityRoleを継承するIdentityRoleを実装し、OnModelCreating()をオーバーライドして関係を追加する必要があります。コンテキストのメソッド。

ロールテーブルのカスタマイズに関するこの記事は、関連する手順を説明するのに適しています。ここでも、新しい列を追加するだけでは大きな問題が発生することがわかります。 IdentityDbContextクラスで作成された元のスキーマからテーブルまたは列を削除することは、おそらくIdentityDbContextクラスの独自の実装を作成するのと同じくらい面倒です。

78
Dave Alperovich

Melinaが指摘したように、元の質問は現在のASP.NET Identity 2.xモデルを参照していました。

Dave Alperovichの回答は、ASP.NET Identityの背後にある概念に関する貴重な背景情報を提供しましたが、例は2014年に置き換えられたASP.NET Identity 1.xから引き出されました。

Callum Liningtonは、「男に魚を教える」という答えを提供します。彼のアドバイスに従うと、2.xの「ApplicationUserManager」クラスが1.xスタイルの「UserManager」から派生していることが簡単にわかります。

答えは基本的に、「AccountController」の作成時にパラメーターとして注入される「ApplicationUserManager」が、独自のコンストラクターでIDデータストアに接続することです。

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

この「隠された」2.xコードは、上記の1.xコードと非常に似ていることに注意してください。

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
0
Scott Taylor

確かにApplicationUserManagerにあります。これは、アプリケーションユーザーを管理するためにdbコンテキストを利用するサービスだと思います。

このクラスを右クリックして、[Go to definitionそして、データベースを初期化するクラスが見えるまでそれを続けます。

また、MVC 4では、初期化はフィルター属性で行われます。フィルターフォルダーがある場合は、それを調べます。 MVC 5ではないことは知っていますが、それでも適用可能です。

0