c# tutorial - Wie kann ich die Tabellennamen bei Verwendung von Visual Studio 2013 ASP.NET Identity ändern?




aspnet owin (5)

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();
    }
}

Sehen Sie this für mehr Details

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. Dies erstellt die folgenden Tabellen:

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

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

  1. Ich würde
  2. Nutzername
  3. PasswortHash
  4. Sicherheitsstempel
  5. Diskriminator

Durch das Hinzufügen von öffentlichen Eigenschaften zu der Klasse "ApplicationUser" habe ich außerdem zusätzliche Felder zu der AspNetUsers-Tabelle wie "Vorname", "Nachname", "PhoneNumber" usw. hinzugefügt.

Hier ist meine Frage. Gibt es eine Möglichkeit, die Namen der obigen Tabellen zu ändern (wenn sie zum ersten Mal erstellt werden) oder werden sie immer mit dem AspNet Präfix benannt, wie ich oben aufgeführt habe? Wenn die Tabellennamen anders benannt werden können, erläutern Sie bitte wie.

- AKTUALISIEREN -

Ich habe @ Hao Kungs Lösung implementiert. Es erstellt eine neue Tabelle (zum Beispiel nannte ich es MyUsers), aber es erstellt auch weiterhin die AspNetUsers-Tabelle. Ziel ist es, die Tabelle "AspNetUsers" durch die Tabelle "MyUsers" zu ersetzen. Siehe folgenden Code und Datenbankabbild der erstellten Tabellen.

Ich möchte tatsächlich jede AspNet Tabelle durch meinen eigenen Namen ersetzen ... Zum Beispiel MyRoles, MyUserClaims, MyUserLogins, MyUserRoles und MyUsers.

Wie erreiche ich das und komme mit nur einem Satz von Tabellen aus?

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");
    }
}

- UPDATE ANTWORT -

Danke 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");
    }

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");

Sie können auch Konfigurationsklassen erstellen und jedes Detail jeder Ihrer Identity-Klassen angeben, zum Beispiel:

using System.Data.Entity.ModelConfiguration;

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

Fügen Sie diese Konfigurationen dann in die OnModelCreating () -Methode ein:

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

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

Dies gibt Ihnen vollständige Kontrolle über jeden Aspekt der Identity-Klassen.


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

Überschreibe OnModelCreating in deinem DbContext, füge folgendes hinzu, dies ändert die AspNetUser-Tabelle zu "Users" du kannst auch die Feldnamen ändern, die Standard-Id-Spalte wird User_Id.

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

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

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

Vollständiges Beispiel (das 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 es mir nicht gelungen ist, das zu erreichen, wenn die aktuelle Tabelle existiert. Beachten Sie auch, welche Spalten Sie nicht zuordnen, die Standardeinstellungen werden erstellt.

Ich hoffe, das hilft.


Hier ist eine sehr schnelle Lösung, die die Tatsache missbraucht, dass die Laufzeit mehrere Instanzen von statischen generischen Klassen erstellt. Entfessle deine inneren Optimierungsdämonen!

Das leuchtet wirklich, wenn Sie Enums aus einem Stream auf generische Weise lesen. Kombiniere es mit einer äußeren Klasse, die auch den zugrunde liegenden Typ des Enums speichert, und einem BitConverter, um das Tolle zu entfesseln.

void Main() 
{
    Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
    Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
    Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));

    int iterations = 1000 * 1000 * 100;
    Measure(iterations, "Cast (reference)", () => { var t = (TestEnum)5; });
    Measure(iterations, "EnumConverter", () => EnumConverter<TestEnum>.Convert(5));
    Measure(iterations, "Enum.ToObject", () => Enum.ToObject(typeof(TestEnum), 5));
}

static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
    public static readonly Func<long, TEnum> Convert = GenerateConverter();

    static Func<long, TEnum> GenerateConverter()
    {
        var parameter = Expression.Parameter(typeof(long));
        var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
            Expression.Convert(parameter, typeof(TEnum)),
            parameter);
        return dynamicMethod.Compile();
    }
}

enum TestEnum 
{
    Value = 5
}

static void Measure(int repetitions, string what, Action action)
{
    action();

    var total = Stopwatch.StartNew();
    for (int i = 0; i < repetitions; i++)
    {
        action();
    }
    Console.WriteLine("{0}: {1}", what, total.Elapsed);
}

Ergebnisse zu Core i7-3740QM mit aktivierten Optimierungen:

Cast (reference): Value
EnumConverter: Value
Enum.ToObject: Value
Cast (reference): 00:00:00.3175615
EnumConverter: 00:00:00.4335949
Enum.ToObject: 00:00:14.3396366




c# asp.net asp.net-membership asp.net-mvc-5 asp.net-identity