visual studio 2019
ASP.NET MVC5
で学習をしています。
------以下追記します 2021/06/22---------
いま、作りたいなと思っているのは架空の学校で登校時間、下校時間などを各ユーザーが
自分で登録するサイトです。
ユーザーさんにはidentity機能で個別にログインしてもらい、登校時間など入力して
submitボタンを押すと、その登校時間などの情報をRecordsテーブルに登録されます。
その時、Recordsテーブルにはどのユーザーさんの情報か識別できるようにするために、
string のApplicationUserId列を作って自動的にApplicationUserIdを登録させようと思っています。
また、過去に登録したことのあるユーザーさんが自分の登録した分の結果を一覧でみることが
できるようにするためにも、ApplicationUserId列は使用したいと考えています。
つまり、各ユーザーさんはログインして自分の分しか登録できないし、自分の分しか登録されたものを
みれないようなサイトをidentityを使って作成しようと考えています。
はじめは、
Modelsに
c#
1public class Record 2{ 3 public int Id { get; set; } 4 5 //~中略~ 6 7 public string ApplicationUserId { get; set; } 8 9 public virtual ApplicationUser ApplicationUser { get; set; } 10} 11
として、コンテキストは
c#
1public class RecordContext:DbContext 2 3{ 4public DbSet<Record> Records { get; set; } 5}
で作っていたのですが、テストのユーザーを作成して、データを登録してもみてもRecordsテーブルのApplicationUserId はNullのままで、ユーザー識別の役に立ちませんでした。
ログインして、登校時間などを登録するだけではダメそうなので、登録と同時にコントールで、ApplicationUser からIdを取り出して、RecordsテーブルのApplicationUserIdに登録するのかなと思い、
初めの質問のようにコンテキストの中に
public DbSet<ApplicationUser> ApplicationUser { get; set; }
を入れて作成しようと思いました。
-----追記終了--------------------------------
Identity機能を使おうとしているのですが、
コンテキストクラスを以下のようにしたところ
C#
1 public class RecordContext:DbContext 2 { 3 public DbSet<Record> Records { get; set; } 4 public DbSet<ApplicationUser> ApplicationUser { get; set; } 5 }
下のようなエラーが出てきます。
AttendanceMg1.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' にはキーが定義されていません。この EntityType にはキーを定義してください。
AttendanceMg1.Models.IdentityUserRole: : EntityType 'IdentityUserRole' にはキーが定義されていません。この EntityType にはキーを定義してください。
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' はキーが定義されていない型 'IdentityUserLogin' に基づいています。
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' はキーが定義されていない型 'IdentityUserRole' に基づいています。
'
IdentityUserLogin、IdentityUserRoleに主キーを定義すれば良いのかなと思うのですが、間違ってないでしょうか。
また、まちがってないとするとどのようにすれば主キーは定義できるでしょうか。
なにとぞ、よろしくお願いいたします。
-----現状についての追記 2021/06/22--------
SurferOnWww さんからのアドバイスで余計なことを考えずに、データを登録するコントロールの中で、
ApplicationUserIdを登録するだけでよいのではと、考えてみました。
早速、以下でやってみました。
コンテキスト
C#
1public class RecordContext:DbContext 2{ 3 public DbSet<Record> Records { get; set; } 4 //public DbSet<ApplicationUser> ApplicationUser { get; set; } 5} 6
コントロール
c#
1[HttpPost] 2[ValidateAntiForgeryToken] 3public ActionResult Create([Bind(Include = "Id,YMD,DOW,Attend,Leave,Task,Updatetime")] Record record) 4{ 5 if (ModelState.IsValid) 6 { 7 record.ApplicationUserId = User.Identity.GetUserId(); 8 db.Records.Add(record); 9 db.SaveChanges(); 10 return RedirectToAction("Index"); 11 } 12 return View(record); 13}
ApplicationUserIdを登録することができて、一覧画面でもログイン中のユーザーさん分だけの表示ができました!!
回答をされることなく追加質問だけで、わたしのやりたいことの実現まで導いてくださってありがとうございます。
ただ、こんなやり方が本当に良いのか解ってないですし、何より初めの質問内容がどうしてありえないことなのかもまったく解っていません。
ご負担になってしまうのかもしれませんが、わたしの実現の仕方のついてのご意見や、初めのコンテキストがありえないことであり、得ないエラーがでていることについての概略でも教えて頂けると嬉しいです。
なにとぞ、よろしくお願いします。
-----現状についての追記終了--------
回答1件
あなたの回答
tips
プレビュー