エンティティフレームワークを使用して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="data source={Azure server};initial catalog={database name};user id={Database User};password={Password};MultipleActiveResultSets=True;App=EntityFramework"" 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;
}
}
以下の手順に従って問題を再現しようとしました。
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="data source=tcp:jambdb.database.windows.net,1433;initial catalog=jambdb;user id=jambor;password=***;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=tcp:jambdb.database.windows.net,1433;initial catalog=jambdb;user id=jambor;password=***;MultipleActiveResultSets=True;App=EntityFramework"" 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]
コメントを追加