(VS2013 RTW、ASP.NET MVC5 を使用)
ASP.NET ID を使用するときに、ApplicationUser クラス (およびテーブル) にプロパティを追加する方法については、多くのドキュメントを見てきました。しかし、外部キーを介して ApplicationUser テーブルにマップされるコンテンツを含む別のテーブルを作成する方法については、ドキュメントを見たことはありません。
独自の Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext を正常に派生し、独自の "UserPreferences" テーブルが SQL Server データベース内のさまざまな "AspNet*" テーブルと調和して共存するようになりました。ただし、現在のユーザーの ID を取得して "UserPreferences" テーブルに新しい行を書き込む最適な方法がわかりません。プロジェクトは 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 に変換するための追加の検索を実行します。これを改善する方法について何か提案はありますか? ユーザー データを別のテーブルに書き込むタスクに正しい方法で取り組んでいますか?
ベストアンサー1
同じ拡張メソッドを使用して、MVCコントローラーとWeb APIコントローラーの両方でユーザーIDを取得できるはずです。アイデンティティ 1.0 RTW パッケージ。
以下は、アイデンティティ パッケージからの拡張機能です。
namespace Microsoft.AspNet.Identity
{
public static class IdentityExtensions
{
public static string FindFirstValue(this ClaimsIdentity identity, string claimType);
public static string GetUserId(this IIdentity identity);
public static string GetUserName(this IIdentity identity);
}
}
IIdentity は、すべての ID タイプの基本インターフェイスです。拡張メソッドを表示するには、「using Microsoft.AspNet.Identity」を追加する必要がある場合があります。
ところで、ユーザー用の外部テーブルを追加する場合、ApplicationUser を使用して、UserPreference にナビゲーション プロパティを追加し、EF でそれらの関係を処理できるようにしてみてはいかがでしょうか。その方が簡単になります。