webentwicklung-frage-antwort-db.com.de

Wie kann ich die Tabellennamen bei Verwendung von ASP.NET Identity ändern?

Ich verwende die Release-Version (RTM, nicht RC) von Visual Studio 2013 (heruntergeladen von MSDN 2013-10-18) und daher die neueste (RTM) Version von AspNet.Identity. Wenn ich ein neues Webprojekt erstelle, wähle ich "Individuelle Benutzerkonten" zur Authentifizierung aus. Dadurch werden die folgenden Tabellen erstellt:

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers

Wenn ich einen neuen Benutzer registriere (unter Verwendung der Standardvorlage), werden diese Tabellen (oben aufgeführt) erstellt und in die AspNetUsers-Tabelle wird ein Datensatz eingefügt, der Folgendes enthält:

  1. Ich würde
  2. UserName
  3. PasswordHash
  4. Sicherheitsstempel
  5. Diskriminator

Durch das Hinzufügen öffentlicher Eigenschaften zur Klasse "ApplicationUser" habe ich der AspNetUsers-Tabelle erfolgreich zusätzliche Felder hinzugefügt, z. B. "FirstName", "LastName", "PhoneNumber" usw.

Hier ist meine Frage. Gibt es eine Möglichkeit, die Namen der obigen Tabellen (beim erstmaligen Erstellen) zu ändern, oder werden sie immer mit dem Präfix AspNet benannt, wie oben aufgeführt? Wenn die Tabellennamen unterschiedlich benannt werden können, erläutern Sie bitte, wie.

- UPDATE -

Ich habe die Lösung von @Hao Kung implementiert. Es wird eine neue Tabelle erstellt (ich habe sie beispielsweise MyUsers genannt), aber es wird auch weiterhin die AspNetUsers-Tabelle erstellt. Ziel ist es, die Tabelle "AspNetUsers" durch die Tabelle "MyUsers" zu ersetzen. Siehe Code unten und Datenbank-Image der erstellten Tabellen.

Eigentlich möchte ich jede AspNet -Tabelle durch meinen eigenen Namen ersetzen ... Zum Beispiel MyRoles, MyUserClaims, MyUserLogins, MyUserRoles und MyUsers.

Wie kann ich dies erreichen und nur einen Satz Tabellen haben?

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string PhonePrimary { get; set; }
    public string PhoneSecondary { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(): base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
    }
}

Database Tables

- ANTWORT AKTUALISIEREN -

Vielen Dank an Hao Kung und Peter Stulinski. Das hat mein Problem gelöst ...

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

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
    }
203
user2315985

Sie können dies leicht tun, indem Sie das IdentityModel.cs wie folgt ändern:

Überschreiben Sie OnModelCreating in Ihrem DbContext und fügen Sie Folgendes hinzu. Dadurch wird die AspNetUser-Tabelle in "Users" geändert. Sie können auch die Feldnamen ändern. Die Standard-ID-Spalte wird zu User_Id.

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

oder einfach das Folgende, wenn Sie alle Standardspaltennamen behalten möchten:

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

Vollständiges Beispiel unten (dies sollte in Ihrer IdentityModel.cs-Datei sein) Ich habe meine ApplicationUser-Klasse so geändert, dass sie User heißt.

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

Bitte beachten Sie, dass ich es nicht geschafft habe, dies zum Laufen zu bringen, wenn die aktuelle Tabelle existiert. Beachten Sie auch, dass die Standardspalten erstellt werden, die Sie nicht zuordnen.

Ich hoffe, das hilft.

121
Piotr Stulinski

Unten ist meine Arbeitslösung:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

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

        modelBuilder.Entity<ApplicationUser>().ToTable("User");
        modelBuilder.Entity<IdentityRole>().ToTable("Role");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

Siehe this für weitere Einzelheiten

57
Frank Myat Thu

Sie können versuchen, diese Methode in Ihrer DbContext-Klasse zu überschreiben, um sie einer Tabelle Ihrer Wahl zuzuordnen:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<IdentityUser>()
            .ToTable("AspNetUsers");
15
Hao Kung

Sie können auch Konfigurationsklassen erstellen und jedes Detail jeder Ihrer Identitätsklassen angeben. Beispiel:

using System.Data.Entity.ModelConfiguration;

public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
    public UserConfig()
    {
        ToTable("Users");
        Property(u => u.LocationName).IsRequired();
    }
}

Nehmen Sie dann diese Konfigurationen in die OnModelCreating () -Methode auf:

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

        modelBuilder.Configurations.Add(new ApplicationUserConfig());
        ...
    }

Auf diese Weise haben Sie die vollständige Kontrolle über alle Aspekte der Identitätsklassen.

1
Manish

Wir können die Standardtabellennamen von asp.net Identity folgendermaßen ändern:

    public class ApplicationDbContext : IdentityDbContext
    {    
        public ApplicationDbContext(): base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

Außerdem können wir jede Klasse erweitern und Klassen wie 'IdentityUser', 'IdentityRole', ... beliebige Eigenschaften hinzufügen.

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, 
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    // Add additional items here as needed
}

Um Zeit zu sparen, können wir AspNet Identity 2.0 Extensible Project Template verwenden, um alle Klassen zu erweitern.

0
Arvand

In .NET CORE (MVC 6) funktioniert dies jedoch nicht, da die Bindung auf geändert werden muss

mögen

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<IdentityRole>().ToTable("Role");
    builder.Entity<IdentityUser>(entity => 
    {
        entity.ToTable("User");
        entity.Property(p => p.Id).HasColumnName("UserId");
    });
}

Es könnte jemandem helfen :)

0
dnxit