2014-01-27 31 views
0

我使用Asp.net Identity創建我的會員模塊,按照本教程http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity,然後我注意到我無法定義INT類型的主鍵,導致用戶模型應該繼承IdentityUser,並在IdentityUser類中定義了Id屬性是這樣的字符串類型,如何解決它?Microsoft.AspNet.Identity無法定義INT主鍵?

namespace Microsoft.AspNet.Identity.EntityFramework 
{ 
    public class IdentityUser : IUser 
    { 
     public IdentityUser(); 
     public IdentityUser(string userName); 

     public virtual ICollection<IdentityUserClaim> Claims { get; } 
     **public virtual string Id { get; set; }** 
     public virtual ICollection<IdentityUserLogin> Logins { get; } 
     public virtual string PasswordHash { get; set; } 
     public virtual ICollection<IdentityUserRole> Roles { get; } 
     public virtual string SecurityStamp { get; set; } 
     public virtual string UserName { get; set; } 
    } 
} 

回答

2

你不能使用默認的成員資格提供改變IdentityUser的基本ID。您將不得不推出自己的IUser實施和存儲。

在這裏有一個偉大的話題How to change type of id in Microsoft.AspNet.Identity.EntityFramework.IdentityUser談論創建自己的實現。

現在這樣說(我個人認爲[停止辯論有關int VS uniqueidentifier主鍵存儲和索引])用戶ID的身份(Id)屬性是不是整數更好唯一的用戶ID。儘管該類是以字符串形式實現的,但其基礎類型基於Guid,請參閱附錄1底部的答案),這比要難得多。順序用戶標識可讓某人瞭解如何定位其他用戶並可能繞過應用程序安全性。不,我沒有方便的例子,只是對我沒有好感。

如果您不想推出自己的應用程序,並且可以調整您的應用程序,我會建議您將其他應用程序暴露給您的ApplicationModel類。此屬性將負責將字符串Id列從IdentityUser轉換爲Guid。除此之外,我將重寫Id屬性(儘管保持邏輯相同)以添加一個很好的intelisense提示,即應該使用ID屬性。

public class ApplicationUser : IdentityUser 
{ 
    /// <summary> 
    /// The unique User GUID 
    /// </summary> 
    [NotMapped] 
    public Guid ID 
    { 
     get { return Guid.Parse(this.Id); } 
     set { this.Id = value.ToString(); } 
    } 

    /// <summary> 
    /// weak userid reference. Use the property <seealso cref="WebApplication6.Models.ID"/> instead 
    /// </summary> 
    public override string Id { get { return base.Id; } set { base.Id = value; } } 
} 

正如你看到的,現在我們與NotMapped屬性添加Guid類型的其他財產ID。 (該屬性是爲了防止EF嘗試存儲此值)此屬性的getterssetters只解析基本字符串IdGuid

現在,這只是一個想法,你可以愉快地(也許更好的選擇)寫你自己的,因爲你認爲適合你的應用程序。

附錄1IndentityUser構造函數。

下面是構造函數從Microsoft.AspNet.Identity.EntityFramework.裝配新IdentityUser注意ID設置爲Guid.NewGuid().ToString()

public IdentityUser() 
{ 
    this.Id = Guid.NewGuid().ToString(); 
    this.Claims = new List<IdentityUserClaim>(); 
    this.Roles = new List<IdentityUserRole>(); 
    this.Logins = new List<IdentityUserLogin>(); 
} 
+0

非常感謝,該死的微軟爲什麼不解決這個最簡單的小問題! – Rwing

+0

@實際上它是IUser實現設計的一部分。但我知道你的意思。希望這可以幫助。 – Nico

+0

有人可以澄清,如果這個答案只適用於身份1.0? Identity 2.0的發佈提到了指定一個TKey的能力,讓你改變這種數據類型。 (我似乎無法弄清楚如何讓這個工作,所以我不能肯定地說話。) – Funka