(VS2013 RTW、ASP.NET MVC5 を使用)
ASP.NET ID を使用するときに、ApplicationUser クラス (およびテーブル) にプロパティを追加する方法に関する多くのドキュメントを見てきました。しかし、外部キーを介して ApplicationUser テーブルにマップされるコンテンツを含む別のテーブルを作成する方法に関するドキュメントは見たことがありません。
独自の Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext の派生に成功し、独自の "UserPreferences" テーブルが SQL Server データベースのさまざまな "AspNet*" テーブルと調和して共存できるようになりました。しかし、「UserPreferences」テーブルに新しい行を書き込むために現在のユーザーの ID を取得する最善の方法については明確ではありません。プロジェクトは ASP.NET MVC ですが、Web API コントローラーを追加しました (そして内部で作業しています)。
私は実用的な解決策を持っています:
var uman = new Microsoft.AspNet.Identity.UserManager<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new Microsoft.AspNet.Identity.EntityFramework.UserStore<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new App1.Data.App1DbContext()));
var uident = User.Identity;
var userobject = uman.FindByNameAsync(uident.Name);
var userid = userobject.Result.Id;
// (Perform new row creation including the userid we just looked up
AspNetUsers テーブル (Identity フレームワークによって定義されている) は、次のフィールドで構成されていると考えてください。
-id (PK, nvarchar(128) - seems to contain a GUID, not sure why not an autoincrement integer, but I assume there are reasons for this)
-Username (nvarchar(max))
-PasswordHash (nvarchar(max))
-SecurityStamp (nvarchar(max))
id フィールド (ユーザー名ではない) は、このテーブルで参照する正しいフィールドだと思います。(ユーザーが自分のユーザー名を変更すると、他の誰かが他のユーザーのユーザー名を引き継ぐ可能性があると考えていました。そのため、両方のフィールドが存在する可能性があります。)したがって、現在のユーザーの ID を取得して、上記のコードが行う「UserPreferences」テーブル。しかし、このルックアップを行わなければならないのは効率が悪いようです。
重要な点は、System.Web.Mvc.Controller のコンテキストでは、次のことができるということです。
User.Identity.GetUserId()
(Runtime type of User.Identity: System.Security.Principal.GenericIdentity)
しかし、System.Web.Http.ApiController (Web API) のコンテキストでは、そのメソッドが存在しないため (User.Identity のランタイム タイプ: System.Security.Claims.ClaimsIdentity)、代わりに依存する必要があるため、できません。 :
User.Identity.Name
追加のルックアップを実行して、名前を ID に変換します。これを改善する方法について何か提案はありますか? ユーザーデータを別のテーブルに正しい方法で書き込むタスクに取り組んでいますか?