エンティティタイプApplicationUserは、現在のコンテキストのモデルの一部ではありません。プロジェクトの開始時に2つの異なるデータベースを使用しました

TheRedCameron

エンティティフレームワークを使用してMVC4アプリケーションを作成し、Azureデータベースでホストしているデータベースに対してデータの読み取りと書き込みを行いました。Azureデータベースは、アプリケーションデータとアプリケーションのログインデータを保持することになっています。

ただし、最初にアプリケーションを作成したとき、ローカルマシンへの接続文字列を削除するのを忘れていました。そのため、2つの異なる場所にある2つの異なるデータベースを使用するアプリケーションを作成しました。1つのデータベースはアプリケーションデータ用(Azure)で、もう1つのデータベースはログインデータ用(ローカル)でした。

このアプリケーションをAzureに公開したいので、アプリケーションとログイン情報にAzureデータベースを使用し、ローカルマシンのデータベースを完全に除外したいと思います。

このプロセスは、最初にローカルデータベースの接続文字列をアプリケーションのweb.configファイルから削除することから始めました。

次に、IdentityModels.csのApplicationDBContextクラスを変更して、以下の変更を反映しました...

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("AbacusEntities", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

これらの変更を行った後、ソリューションをクリーンアップして再構築し、自分のマシンで実行しました。ログインしようとすると(とにかくこの時点では失敗します)、「エンティティタイプApplicationUserは現在のコンテキストのモデルの一部ではありません」というエラーが表示されます。AccountController.csファイルの以下のコード。'***'でマークされた行は、エラーが呼び出された行です。

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        ***var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

また、新しいユーザーを登録しようとすると、AccountController.csファイルの次のコード行で「Register」という名前のメソッドで同じエラーが発生します。これは、ユーザーがユーザー登録を送信するときのPOSTメソッドです。

var result = await UserManager.CreateAsync(user, model.Password);

また、以下のweb.configの接続文字列を参照してください。もちろん、すべての機密情報は削除されています。

add name="AbacusEntities" connectionString="metadata=res://*/Models.AbacusModel.csdl|res://*/Models.AbacusModel.ssdl|res://*/Models.AbacusModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source={Azure server};initial catalog={database name};user id={Database User};password={Password};MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" 

たくさんの投稿を調べましたが、役立つ情報が見つかりません。次のステップは、ユーザーアカウント用にローカルデータベースから作成したテーブルをAzureデータベースに移行することだと思っていましたが、これが機能するとは完全には確信していません。

私がやりたいのは、Azureデータベースでこれらのテーブルを生成し、VisualStudioを使用してそれらを認証に使用することです。

最初に2つの異なるデータベースを使用してログインした場合、ログインプロセスは正常に機能しましたが、Azureで生成されるログインデータのテーブルを取得する必要があります。

ご協力をよろしくお願いいたします。追加情報が必要な場合はお知らせください。

コメントからの更新:

クラスApplicationUserは、IdentityModel.csファイルで定義されています。以下はクラスです。

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}
ジャンバー-MSFT

以下の手順に従って問題を再現しようとしました。

1)Asp.net MVCテンプレートを作成してから、新しいユーザーを登録します。

結果:ローカルデータベースでユーザー情報を見つけることができました。

2)EntityFrameworkを使用してビューを持つコントローラーを追加します。また、AzureSQLデータベースをリソースとして使用します。

結果:web.configに2つの接続が見つかります

3)デフォルトの接続文字列を削除します

4)アプリケーションDBコンテキスト接続文字列を変更します

   <add name="jambdbEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:jambdb.database.windows.net,1433;initial catalog=jambdb;user id=jambor;password=***;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("jambdbEntities", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }

上記の手順の後、私のアプリケーションは以下のエラーを表示します:

ここに画像の説明を入力してください

解決策

1)「DefaultConnection」接続文字列を編集します

  <connectionStrings>
    <add name="jambdbEntitiesapplication"   providerName="System.Data.SqlClient" connectionString="Server=tcp:jambdb.database.windows.net,1433;Initial Catalog=jambdb;Persist Security Info=False;User ID=jambor;Password=***;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" />
    <add name="jambdbEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:jambdb.database.windows.net,1433;initial catalog=jambdb;user id=jambor;password=***;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

2)コードを変更します。

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("jambdbEntitiesapplication", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }

3)AutomaticMigrationsEnabled = true;Migrationsフォルダーの下のConfigurationクラスで変更します。

結果は次のとおりです。

ここに画像の説明を入力してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ