2015-01-16 47 views
1

如何,我可以使用ASP.NET身份與自定義表結構,是UserUserIdPassword)和UserRoleUserId,IsAdmin,IsNormalUser,IsManager) 隨着MVC 5? 我不想使用所有默認表,如AspNetUsers,AspNetRoles,AspNetUserClaims,AspNetUserRoles, AspNetUserLoginsASP.NET MVC5身份使用自定義的表結構

+0

也許你可以做一個自定義的界面,這裏是一個例子:http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity – Aristos

+0

感謝Aristos !但仍然這個例子有所有的表與AspNet表相同,我的問題是我只有兩個表如上所述,沒有其他列。 –

回答

1

使用OnModelCreating事件將表和/或列映射到您自己的模式,正如我在this StackOverflow question中所做的那樣。

這看起來會喜歡 -

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    var user = modelBuilder.Entity<IdentityUser>().HasKey(u => u.Id).ToTable("User", "Users"); //Specify our our own table names instead of the defaults 

    user.Property(iu => iu.Id).HasColumnName("UserId"); 
    user.Property(iu => iu.UserName).HasColumnName("UserName"); 
    user.Property(iu => iu.PasswordHash).HasColumnName("Password"); 
    user.Ignore(iu => iu.Email); 
    user.Ignore(iu => iu.EmailConfirmed); 
    user.Ignore(iu => iu.PhoneNumber); 
    user.Ignore(iu => iu.PhoneNumberConfirmed); 
    user.Ignore(iu => iu.AccessFailedCount); 
    user.Ignore(iu => iu.LockoutEnabled); 
    user.Ignore(iu => iu.LockoutEndDateUtc); 
    user.Ignore(iu => iu.SecurityStamp); 
    user.Ignore(iu => iu.TwoFactorEnabled); 

    user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId); 

    user.Ignore(iu => iu.Logins); 
    user.Ignore(iu => iu.Claims); 

    modelBuilder.Ignore<IdentityUserClaim)(); 

    modelBuilder.Ignore<IdentityUserLogin>(); 

... 

} 

這裏的流暢API的關鍵部分是ToTable([TableName], [SchemaName])HasColumnName([ColumnName])

這可以適應要麼創建表時使用的標準實體框架Code First,或映射到現有數據庫或使用SQL腳本手動創建的數據庫。

更多關於代碼第一次看到Code First to a New Database(包括流利的API映射)

當你想要忽略的DbContext類的屬性,並排除被完全映射一些的DbContext類,你將要使用的.Ignore() extension method無映射屬性和.Ignore<T>() extension method的模型生成器的類。

這些屬性(和集合)仍將存在於內存中,但不會保留到數據庫中。

+0

謝謝,但我仍然無法得到它的工作,因爲它需要像索賠,角色表我的問題很簡單我有兩個表User和UserRole上面沒有任何其他領域完全描述。 –

+0

@ManojPrajapati從你的問題中不清楚,只有你的評論。我已經更新了答案,以顯示如何避免映射不需要的表和列。 – pwdst

+0

我試過這樣做,以避免AspNetUserLogins表,但它不起作用。某些函數(如FindByNameAsync)告訴我登錄導航屬性不存在。我將不得不編寫自己的函數並覆蓋默認值,這是不值得的。即使它沒有被使用,我寧願擁有桌子。 – Brad