2014-04-04 26 views
41

Yıllardır ASP.net üyeliğini kullandım ve ASP.net kimliğini denemeye başladım. Sadece sürüm 2.0'ı piyasaya sürdüler ve bunun int birincil anahtarını desteklemesi gerekiyordu.Int.net sütunlarıyla ASP.net Identity 2.0 için tablo adları nasıl değiştirilir?

public class User : IdentityUser<int, UserLogin, UserRole, UserClaim> 
{ 
} 

public class UserLogin : IdentityUserLogin<int> 
{ 
} 

public class Role : IdentityRole<int, UserRole> 
{ 
    public string Description { get; set; } // Custom description field on roles 
} 

public class UserRole : IdentityUserRole<int> 
{ 
} 

public class UserClaim : IdentityUserClaim<int> 
{ 
} 

public class MyDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim> 
{ 
    public MyDbContext() : this("MyDB") { } 

    public MyDbContext(string connStringName) : base(connStringName) 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<User>().ToTable("Users"); 
     modelBuilder.Entity<Role>().ToTable("Roles"); 
     modelBuilder.Entity<UserRole>().ToTable("UserRoles"); 
     modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); 
     modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

Bir veritabanı oluşturup taşıma, düzgün kimlik tablolarının her biri için bir tamsayı kimliği sütun oluşturur, ancak, bunu: tamsayı birincil anahtar destek almak için aşağıdaki gibi benim özel kimlik sınıfları tanımladığınız OnModelCreating yönteminde belirtilen özel tablo adlarını görmezden geliyor. Bunun yerine, dbo.AspNetUsers ve dbo.AspNetRoles gibi tablo adlarını alıyorum.

Özel kimlik sınıflarıma [Table("TableName")] eklemeyi de denedim ve hiçbir etkisi yok. Ancak

modelBuilder.Entity<User>().ToTable("Users"); 
modelBuilder.Entity<IdentityUser<int, IdentityUserLogin<int>, IdentityUserRole<int>, IdentityUserClaim<int>>>().ToTable("Users"); 

modelBuilder.Entity<Role>().ToTable("Roles"); 
modelBuilder.Entity<IdentityRole<int, UserRole>>().ToTable("Roles"); 

modelBuilder.Entity<UserRole>().ToTable("UserRoles"); 
modelBuilder.Entity<IdentityUserRole<int>>().ToTable("UserRoles"); 

modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); 
modelBuilder.Entity<IdentityUserLogin<int>>().ToTable("UserLogins"); 

modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); 
modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("UserClaims"); 

, ben çeşitli varyasyonlar denedim ve benim göçler üretmek olmaz: bunlar temel Kimlik sınıfları kullanarak modelBuilder.Entry<Type>().ToTable("TableName") çizgilerin her tekrarlanan gibi ASP.net Kimlik 1.0 örneklere baktığımızda

, görünüyordu . benzeri hatalar almaya devam ettim: Microsoft.AspNet.Identity.EntityFramework.IdentityUser'4 [System.Int32, Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin'1 [System.Int32], Microsoft.AspNet.Identity.EntityFramework. IdentityUserRole'1 [System.Int32], Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim'1 [System.Int32]] 'eşlenmedi. Yoksay yöntemini veya NotMappedAttribute veri notunu kullanarak türün açık bir şekilde hariç tutulmadığını kontrol edin. Türün sınıf olarak tanımlandığını, ilkel veya genel olmadığını ve EntityObject öğesinden devralmadığını doğrulayın.

ASP.NET Kimlik 2.0'da tamsayı birincil anahtarlarıyla özel tablo adlarını nasıl oluşturabilirim?

+0

listelenen isimler 3.0 diş hekimliği, [check out this q/a] (http://stackoverflow.com/questions/34523066/how-can-i-change-the-table-names-used-by-asp-net-identity-3- vnext). + 1'ler yaklaşık – Terminus

cevap

73

Grrr ...... Bunun için birkaç saat harcadıktan sonra, kurallarımı kopyalayıp base.OnModelCreating(modelBuilder); satırının altına yapıştırdım ve her şey düzgün çalıştı. IdentityModel.cs dosyasında

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); // This needs to go before the other rules! 

    modelBuilder.Entity<User>().ToTable("Users"); 
    modelBuilder.Entity<Role>().ToTable("Roles"); 
    modelBuilder.Entity<UserRole>().ToTable("UserRoles"); 
    modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); 
    modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); 
} 
+0

İlgi Çekici Nokta - base.OnModelCreating (modelBuilder); Benim için de işe yaradı .. :) –

+1

Bir postanın cankurtaranı, ilk önce temel imp çağırması gerekmiyordu, hiç de sezgisel değildi. Kimlik 2.0 kullanılıyorsa, model türleri IdentityRole, IdentityUser, IdentityUseRole, vb ... ancak aynı prensip geçerlidir. –

+0

Çok teşekkür ederim! Bir üssü nasıl buldunuz.OnModelCreating önce aramak zorunda kaldı? –

7

, ben aşağıdaki kodu eklendi: Ben gerekli temel yöntemi ilk :(

Şimdi herşey aşağıdaki yapılandırmayı kullanarak düzgün çalıştığını

çağrılacak olduğunu fark etmedi ApplicationDbContext sınıf

Bildirim Modeli isimleri farklı olduğunu o sen i aramak için buraya arazi için ne kabul edilen yanıt

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

     modelBuilder.Entity<ApplicationUser>().ToTable("SystemUsers"); 
     modelBuilder.Entity<IdentityRole>().ToTable("SystemRoles"); 
     modelBuilder.Entity<IdentityUserRole>().ToTable("SystemUserRoles"); 
     modelBuilder.Entity<IdentityUserLogin>().ToTable("SystemUserLogins"); 
     modelBuilder.Entity<IdentityUserClaim>().ToTable("SystemUserClaims"); 
    } 
+0

bu daimi olarak değiştirilebiliyor, aşağıdaki kodu değiştirerek etkinlik de kalmalı – SAR

İlgili konular