未来技術の光と影。
SIYOU’s Chronicle




■内容

MVC5のサンプルログイン画面をデータベースファーストで使用しようとして
『エンティティ型 ApplicationUser は、現在のコンテキストのモデルに含まれていません』
のエラーとなる。

※こちらにちゃんとした解説がありました。
 ASP.NET MVC アプリケーション開発入門: 第 8 回 Action Filter について

■解決方法

「Web.config」の DefaultConnection の接続文字列を変更する。

  <add name="DefaultConnection" connectionString="Data Source=(LocalDb)v11.0;AttachDbFilename=...
  providerName="System.Data.SqlClient" />

 ★この "DefaultConnection" を既存DBへの接続文字列に変更する。

  <add name="DefaultConnection" connectionString="Server=TestServer;Database=業務Db;User Id=test;Password=test"
  providerName="System.Data.SqlClient" />
  のような従来型(?)の接続文字列にする。たぶん【providerName="System.Data.SqlClient"】となっているのが必須。

■経緯

今回は最大の難関だった、

'/' アプリケーションでサーバー エラーが発生しました。
エンティティ型 ApplicationUser は、現在のコンテキストのモデルに含まれていません。

行 153: {
行 154:  var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
行 155:  var result = await UserManager.CreateAsync(user, model.Password);
行 156:  if (result.Succeeded)
行 157:   {

について。これの解決だけで丸々4日費やした。

●やったこと。

1.「ASP.NET MVC5 実践プログラム」
 http://codezine.jp/article/detail/8114
 を参考にして、既存SQLServerのデータを使用するプロジェクトをデータベース・ファーストで作成。

2.ログイン実行
 ・上記1.で作られたサンプルから「ログイン」→「新しいユーザーとして登録する」と進んで登録を実行。
 ・この時点で「App_Data」フォルダの下に「aspnet-Web...~.mdf」という名前の mdf ファイルが自動生成される。

3.mdf ファイルの一本化
 ・このままではイヤなので、上記 mdf ファイル内のテーブルを、ターゲットの SQLserver の中に移す。
 ・上記 .mdf ファイルを「SQLServer Management Studio」で開く。
 ・データベース名を右クリックし、「タスク」→「スクリプトの生成」を開き、ウィザードに従って
  「特定のデータベースオブジェクトの選択」を選択し、「dbo.AspNet...」で始まる5ファイルを選択
  生成されたスクリプトをターゲットのDBで実行する。

4.ASP.NET Identity用のDBの接続先を変更
 ・VSのソリューションエクスプローラの一番下の「Web.config」を開く
 ・自動生成された認証用のDBと、自分の指定した既存DBの接続文字列がある。
  (サーバーエクスプローラを使用すると、自動生成される。)

  <add name="DefaultConnection" connectionString="Data Source=(LocalDb)v11.0;AttachDbFilename=...
   providerName="System.Data.SqlClient" />
  <add name="業務DBEntities" connectionString="metadata=res://*/Models.業務DB.csdl|res://*/Models...
   providerName="System.Data.EntityClient" />

 ★この "DefaultConnection" を既存DBへの接続文字列に変更するのだが、"業務DBEntities" と同じにしてはだめで、

  <add name="DefaultConnection" connectionString="Server=TestServer;Database=業務DB;User Id=test;Password=test"
   providerName="System.Data.SqlClient" />

  のような従来型(?)の接続文字列にする。たぶん【providerName="System.Data.SqlClient"】となっているのが必須。

●これを、「IdentityModels.cs」の中の

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

を、

  public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
  {
    public ApplicationDbContext()
     : base("業務DBEntities", throwIfV1Schema: false)
    {

に変更してやろうとして、嵌った。

そんなに特殊なことをしているとは思えないのだが、せめて、検索結果で
『エンティティ型 ApplicationUser は、現在のコンテキストのモデルに含まれていません』
がそのまままヒットして欲しい。

■インデックス
MVC5データベースファーストでちゃっちゃとモバイルサイト
1.MVC5 データベースファースト テーブル値関数の使用方法
2.MVC5 複数項目あるモデルの定義
3.MVC5 ビューでの数値項目右寄せカンマ編集
4.MVC5 BootStrap でのアコーディオン
5.MVC5 データベースファースト ASP.NET Identity に嵌る
6.MVC5 テーブル値関数の再取り込み方法
7.MVC5 Session情報に配列を記録する方法
8.MVC5 AWS へのアップロード方法
9.SQL Server 読み込み専用ユーザの設定方法
10.MVC5 セッションタイムアウト後にLogin画面に戻す方法
11.自己認証による https化
12.LinQ の遅延実行に泣く



コメント ( 0 ) | Trackback ( 0 )