2014-03-19 45 views
4

我想使用的GUID的字符串而不是我的主鍵,並遵循以下職位:How to change type of id in Microsoft.AspNet.Identity.EntityFramework.IdentityUserHow to change type of id in Microsoft.AspNet.Identity.EntityFramework.IdentityUserASPNET身份使用GUID作爲關鍵

我更新到ASPNET身份的最新搶鮮包

Microsoft ASP.NET Identity Core 2.0.0-beta1

Microsoft ASP.NET Identity EntityFramework 2.0.0-beta1

和編輯我的用戶允許的GUID,而不是默認的字符串,然後,我創建了自己的DbContext和的UserManager,但每次我嘗試登錄我得到以下錯誤:

System.Data.SqlClient.SqlException: Operand type clash: uniqueidentifier is incompatible with int

這條線:

var user = await UserManager.FindAsync(model.UserName, model.Password);

我已經檢查,以確保數據庫中的所有領域是絕對uniqueidentifiers,我不知道下一個嘗試一下,下面是我目前使用的代碼:

用戶對象:

public class GuidRole : IdentityRole<Guid, GuidUserRole> 
    { 
     public GuidRole() 
     { 
      Id = Guid.NewGuid(); 
     } 
     public GuidRole(string name) : this() { Name = name; } 
    } 
    public class GuidUserRole : IdentityUserRole<Guid> { } 
    public class GuidUserClaim : IdentityUserClaim<Guid> { } 
    public class GuidUserLogin : IdentityUserLogin<Guid> { } 

    public class User : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> 
    { 
     public User() 
     { 
      Id = Guid.NewGuid(); 
     } 

     public User(string name) : this() { UserName = name; } 

     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

的DbContext:

public class newDbContext : IdentityDbContext<User, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> 
{ 
    public newDbContext() 
     : base(nameOrConnectionString: "defaultConnection") { } 

    public newDbContext(string connectionString) 
     : base(nameOrConnectionString: connectionString) { } 

    static newDbContext() 
    { 
     Database.SetInitializer<newDbContext>(null); 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // Use singular table names 
     base.OnModelCreating(modelBuilder); 


     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     modelBuilder.Entity<User>().ToTable("User").Property(p => p.Id).HasColumnName("UserID"); 
     modelBuilder.Entity<User>().Property(p => p.Email).HasColumnName("EmailAddress"); 

     modelBuilder.Entity<GuidUserRole>().HasKey(r => new { r.RoleId, r.UserId }); 
     modelBuilder.Entity<GuidUserRole>().ToTable("UserRole"); 
     modelBuilder.Entity<GuidUserRole>().Property(r => r.UserId).HasColumnName("UserID"); 
     modelBuilder.Entity<GuidUserRole>().Property(r => r.RoleId).HasColumnName("RoleID"); 

     modelBuilder.Entity<GuidUserLogin>().ToTable("UserLogin"); 
     modelBuilder.Entity<GuidUserLogin>().Property(r => r.UserId).HasColumnName("UserID"); 

     modelBuilder.Entity<GuidUserClaim>().ToTable("UserClaim"); 
     modelBuilder.Entity<GuidUserClaim>().Property(r => r.Id).HasColumnName("UserClaimID"); 

     modelBuilder.Entity<GuidRole>().HasKey<Guid>(r => r.Id); 
     modelBuilder.Entity<GuidRole>().ToTable("Role"); 
     modelBuilder.Entity<GuidRole>().Property(r => r.Id).HasColumnName("RoleID"); 

     Configuration.ProxyCreationEnabled = false; 
     Configuration.LazyLoadingEnabled = false; 
    } 

} 

最後是用戶管理:

public class ApplicationUserManager : UserManager<User, Guid> 
{ 
    public ApplicationUserManager(string connectionString) 
     : base(new UserStore<User, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>(new newDbContext())) 
    { 

     UserValidator = new UserValidator<User, Guid>(this) { AllowOnlyAlphanumericUserNames = false }; 
    } 
} 
+1

也許嘗試沒有您的OnModelCreating作爲測試,看看是否有東西在導致錯誤? –

回答

0

感謝郝孔祥熙的意見我個人通過表和屬性映射去,直到我到了UserClaims表。原來我在數據庫中設置了字段類型爲uniqueidentifier,但是這仍然需要一個int。改變它解決了問題!