ASP.NET पहचान का उपयोग करते समय मैं तालिका के नाम कैसे बदल सकता हूं?


213

मैं विजुअल स्टूडियो 2013 के रिलीज़ संस्करण (RTM, RC नहीं) (MSDN 2013-10-18 से डाउनलोड किया गया) और इसलिए AspNet.Identity का नवीनतम (RTM) संस्करण उपयोग कर रहा हूँ। जब मैं एक नया वेब प्रोजेक्ट बनाता हूं, तो मैं प्रमाणीकरण के लिए "व्यक्तिगत उपयोगकर्ता खाते" का चयन करता हूं। यह निम्न तालिकाएँ बनाता है:

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

जब मैं एक नया उपयोगकर्ता पंजीकृत करता हूं (डिफ़ॉल्ट टेम्प्लेट का उपयोग करके), इन तालिकाओं (ऊपर सूचीबद्ध) बनाई जाती हैं और AspNetUsers तालिका में एक रिकॉर्ड डाला जाता है जिसमें शामिल होता है:

  1. ईद
  2. उपयोगकर्ता नाम
  3. PasswordHash
  4. SecurityStamp
  5. discriminator

इसके अतिरिक्त, सार्वजनिक गुणों को वर्ग "ApplicationUser" में जोड़कर मैंने AspNetUser तालिका में अतिरिक्त फ़ील्ड सफलतापूर्वक जोड़े हैं, जैसे "FirstName", "LastName", "PhoneNumber", आदि।

यहाँ मेरा सवाल है। क्या उपरोक्त तालिकाओं के नाम बदलने का एक तरीका है (जब वे पहली बार बनाए गए हैं) या क्या उन्हें हमेशा AspNetउपसर्ग के साथ नामित किया जाएगा जैसा कि ऊपर सूचीबद्ध किया गया है? यदि तालिका के नाम अलग-अलग नाम दिए जा सकते हैं, तो कृपया बताएं कि कैसे।

-- अपडेट करें --

मैंने @ हाउ कुंग का समाधान लागू किया। यह एक नई तालिका बनाता है (उदाहरण के लिए मैंने इसे MyUsers कहा है), लेकिन यह अभी भी AspNetUsers तालिका बनाता है। लक्ष्य "AspNetUsers" तालिका को "MyUser" तालिका से बदलना है। नीचे दिए गए कोड और बनाई गई तालिकाओं की डेटाबेस छवि देखें।

मैं वास्तव में प्रत्येक AspNetतालिका को अपने नाम से बदलना चाहूंगा ... For fxample, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles और MyUser।

मैं इसे कैसे पूरा करूं और केवल एक सेट टेबल के साथ समाप्त करूं?

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

डेटाबेस टेबल्स

- अद्यतन उत्तर -

हाओ कुंग और पीटर स्टुलिंस्की दोनों के लिए धन्यवाद। इससे मेरी समस्या हल हो गई ...

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

क्या आपको यकीन है? कृपया अपनी सभी तालिकाएँ हटा दें, अपनी माइग्रेशन तालिका हटा दें और फिर प्रयास करें। जो कोड मैंने नीचे पोस्ट किया है, जो आपके जैसा ही है, वह एस्पेनेटयूजर टेबल नहीं बनाता है।
पियोट्र स्टूलिंस्की

1
आपके कोड और मेरे बीच एकमात्र अंतर यह है कि मैंने ApplicationUser का नाम बदलकर "उपयोगकर्ता" कर दिया है। मेरा व्यवहार काफी अलग है। पहले बनाने पर यह आवश्यकतानुसार सारणी बनाता है और मेरे द्वारा निर्दिष्ट नामों के साथ .... हो सकता है कि "प्रयोग" के लिए केवल उपयोगकर्ता के लिए ApplicationUser को बदलने के लिए प्रयास करें और फिर लाइनों को जोड़ें ।.OMModelCreating (modelBuilder); modelBuilder.Entity <IdentityUser> () .ToTable ("उपयोगकर्ता", "dbo"); modelBuilder.Entity <ApplicationUser> () .ToTable ("उपयोगकर्ता", "dbo");
पियोट्र स्टूलिंस्की

1
उपर्युक्त समाधान ...
user2315985

6
@Daskul निकालें modelBuilder.Entity <IdentityUser> ()। ToTable ("Myserser")। संपत्ति (p => p.Id) .HasColumnName ("UserId"); और उस स्थिति में भेदभाव करने वाला कॉलम MyUsers तालिका में नहीं जोड़ा जाएगा। अधिक जानकारी के लिए यह त्रुटि देखें: stackoverflow.com/questions/22054168/…
सर्गेई

1
@ user2315985 - आपको modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");@Sergey द्वारा बताई गई लाइन को हटाने के लिए अपना जवाब अपडेट करना चाहिए । अन्यथा, नई नामित MyUsersतालिका में @Daskul बताया गया है कि एक विभेदक स्तंभ है। इसके अलावा, आपकी MyUserClaimsतालिका संरचना गलत होगी क्योंकि @Matt ओवरऑल बताया गया है। मुझे लगता है कि जोड़ने के लिए विचार एक टिप्पणी से @ msiang एक msdn ब्लॉग में आया था , लेकिन यह गलत है!
किंबौड़ी

जवाबों:


125

आप नीचे दिए अनुसार IdentityModel.cs को संशोधित करके आसानी से कर सकते हैं:

अपने DbContext में OnModelCreating को ओवरराइड करें फिर निम्नलिखित जोड़ें, इससे AspNetUser तालिका "उपयोगकर्ता" में बदल जाएगी आप फ़ील्ड के नाम भी बदल सकते हैं डिफ़ॉल्ट आईडी कॉलम User_Id बन जाएगा।

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

या बस नीचे अगर आप सभी मानक कॉलम नाम रखना चाहते हैं:

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

नीचे पूर्ण उदाहरण (यह आपकी IdentityModel.cs फ़ाइल में होना चाहिए) मैंने अपना एप्लीकेशनयूजर वर्ग बदलकर उपयोगकर्ता कहलाया।

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

कृपया ध्यान दें कि यदि वर्तमान तालिका मौजूद है तो मैं यह काम करने में कामयाब नहीं हुआ हूं। यह भी नोट करें कि आप जो भी कॉलम मैप नहीं करते हैं वे डिफ़ॉल्ट बनाए जाएंगे।

उम्मीद है की वो मदद करदे।


2
इन परिवर्तनों को एक प्रभाव में आने के लिए आपको मौजूदा डेटाबेस में परिवर्तनों को धकेलने के लिए माइग्रेशन का उपयोग करने की आवश्यकता है।
लुकाज़

2
यदि आप ऐसा करते हैं, तो आपकी विदेशी कुंजी थोड़ी अजीब होगी, मुझे नहीं लगता कि आपको IdentityUser पर तालिका का नाम बदलने की आवश्यकता है। इस SO पोस्ट को
मैट ओवरऑल

बस एक अतिरिक्त जांच के रूप में इसने मुझे पहले पकड़ा। सुनिश्चित करें कि कॉल base.OnModelCreatingओवरराइड में कोड की पहली पंक्ति है अन्यथा बाकी पंक्तियों को आधार पहचान वर्ग द्वारा अधिलेखित कर दिया जाता है।
डेविड जी

@ दाविद आपको वास्तव में धन्यवाद
SA

अच्छा समाधान। लेकिन IdentityUser के लिए तालिका का नाम अधिलेखित करना आवश्यक नहीं है। इस समाधान को देखें stackoverflow.com/questions/28016684/…
EJW

59

नीचे मेरा काम समाधान है:

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

अधिक विस्तार के लिए इसे देखें


क्या आप (बदसूरत) धाराप्रवाह एपीआई के बजाय विशेषताओं को निर्दिष्ट करके ऐसा कर सकते हैं?
मारीज जमरो

किसी भी तरह से एक मामूली संपादित करें मैंने इस उत्तर को अस्वीकार कर दिया और ध्यान नहीं दिया! इस तरह के लिंक के लिए पसंदीदा विधि का उपयोग करने के लिए इसे अपडेट किया गया[text](link)
डेविड जूल

मैंने एक खाली एमवीसी परियोजना बनाई, इसे 1 बार चलाया, और एस्प-नामित तालिकाओं का निर्माण किया गया। फिर मैंने इस मामूली बदलाव को जोड़ा, अपनी सभी तालिकाओं और माइग्रेशन फ़ोल्डर (इसके लायक) को हटा दिया और अपने कोड को फिर से चलाया, लेकिन तालिकाओं का नाम बदलने से इनकार कर दिया। मैंने फिर एक पूरी तरह से नई परियोजना बनाई, चलाने से पहले यह बदलाव किया, और अब इसका काम कर रहा है। क्या मुझे कुछ बहुत स्पष्ट याद आ रहा है ??
mathkid91

15

आप अपने DbContext वर्ग में इस पद्धति को ओवरराइड करने की कोशिश कर सकते हैं ताकि इसे अपने चयन की तालिका में मैप किया जा सके:

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

7
कॉल करने के लिए मत भूलना base.OnModelCreating(modelBuilder);या बाकी मॉडल नहीं बनाया जाएगा।
फेरुशियो

मैंने @ कुओंग के समाधान को लागू करने के बाद अपना प्रश्न अपडेट किया लेकिन समस्या बनी हुई है, कृपया मेरे संपादित प्रश्न को ऊपर देखें। धन्यवाद।
user2315985

1

आप कॉन्फ़िगरेशन कक्षाएं भी बना सकते हैं और अपने प्रत्येक पहचान वर्ग के प्रत्येक विवरण को निर्दिष्ट कर सकते हैं, उदाहरण के लिए:

using System.Data.Entity.ModelConfiguration;

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

और फिर OnModelCreating () विधि में इन विन्यासों को शामिल करें:

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

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

यह आपको पहचान वर्गों के हर पहलू पर पूर्ण नियंत्रण प्रदान करेगा।


1

महज दस्तावेजीकरण के उद्देश्य से, जो इस पद पर आने वाले वर्षों में भविष्य के बारे में कुछ भी बताता है, (मेरी तरह XD), मेरी टिप्पणी के लिए दिए गए सभी उत्तर सही हैं, लेकिन आप अपने ब्लॉग पर अलेक्जेंड्रू बुकुर द्वारा दी गई इस विधि से अनभिज्ञ हो सकते हैं

         //But this method is not longer supported on netcore > 2.2, so I need to fix it
         foreach (var entityType in modelBuilder.Model.GetEntityTypes())
         {
            var table = entityType.Relational().TableName;
             if (table.StartsWith("AspNet"))
             {
                 entityType.Relational().TableName = table.Substring(6);
             }
         };

        //This is the functional way on NetCore > 2.2
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            var tableName = entityType.GetTableName();
            if (tableName.StartsWith("AspNet"))
            {
                entityType.SetTableName(tableName.Substring(6));
            }
        }

0

हम asp.net पहचान डिफ़ॉल्ट तालिका नाम इस तरह से बदल सकते हैं:

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

इसके अलावा हम प्रत्येक वर्ग का विस्तार कर सकते हैं और 'IdentityUser', 'IdentityRole' जैसी कक्षाओं में किसी भी संपत्ति को जोड़ सकते हैं, ...

    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
}

समय बचाने के लिए हम सभी वर्गों का विस्तार करने के लिए AspNet Identity 2.0 एक्सटेंसिबल प्रोजेक्ट टेम्पलेट का उपयोग कर सकते हैं ।


0

लेकिन यह .NET CORE (MVC 6) में काम नहीं करता है इसके लिए हमें बाइंडिंग को बदलना होगा

पसंद

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

यह किसी की मदद कर सकता है :)


क्या यह कोड-प्रथम और डेटाबेस-प्रथम दोनों के लिए काम करता है?
लियांग

मैंने पहले डेटाबेस के लिए कोशिश नहीं की है, लेकिन मुझे लगता है कि यह काम करना चाहिए अगर मॉडल और डेटाबेस समान हैं।
dnxit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.