ASP.NET পরিচয় ব্যবহার করার সময় আমি টেবিলের নামগুলি কীভাবে পরিবর্তন করতে পারি?


213

আমি ভিজ্যুয়াল স্টুডিও 2013 এর রিলিজ সংস্করণ (আরটিএম, আরসি নয়) ব্যবহার করছি (এমএসডিএন 2013-10-18 থেকে ডাউনলোড হয়েছে) এবং সুতরাং এসপনেট.আইডেন্টিটির সর্বশেষ (আরটিএম) সংস্করণ। আমি যখন একটি নতুন ওয়েব প্রকল্প তৈরি করি, আমি প্রমাণীকরণের জন্য "স্বতন্ত্র ব্যবহারকারী অ্যাকাউন্টগুলি" নির্বাচন করি। এটি নিম্নলিখিত সারণীগুলি তৈরি করে:

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

আমি যখন কোনও নতুন ব্যবহারকারীর নিবন্ধকরণ করি (ডিফল্ট টেম্পলেট ব্যবহার করে), এই সারণীগুলি (উপরে তালিকাভুক্ত) তৈরি করা হয় এবং অ্যাস্পনেট ব্যবহারকারীদের সারণিতে একটি রেকর্ড inোকানো থাকে:

  1. আইডি
  2. ব্যবহারকারীর নাম
  3. PasswordHash
  4. SecurityStamp
  5. Discriminator

অতিরিক্ত হিসাবে, "অ্যাপ্লিকেশন ব্যবহারকারী" শ্রেণিতে সর্বজনীন বৈশিষ্ট্য যুক্ত করে আমি সফলভাবে "ফার্স্টনাম", "লাস্টনাম", "ফোন নাম্বার" ইত্যাদির মতো এসপনেট ব্যবহারকারীদের টেবিলে অতিরিক্ত ক্ষেত্র যুক্ত করেছি added

আমার প্রশ্ন এখানে। উপরের টেবিলগুলির নাম পরিবর্তন করার কোনও উপায় আছে (যখন তারা প্রথম তৈরি করা হবে) বা AspNetআমি উপরে উল্লিখিত হিসাবে সেগুলি কি সর্বদা উপসর্গের সাথে নাম দেওয়া হবে ? যদি টেবিলের নামগুলি আলাদাভাবে নামকরণ করা যায় তবে দয়া করে কীভাবে তা ব্যাখ্যা করুন।

-- হালনাগাদ --

আমি @ হাও কুং এর সমাধানটি প্রয়োগ করেছি। এটি একটি নতুন সারণী তৈরি করে (উদাহরণস্বরূপ আমি এটিকে মাই ইউজার বলেছি), তবে এটি এখনও অ্যাসনেট ব্যবহারকারীদের সারণী তৈরি করে। লক্ষ্যটি হ'ল "অ্যাস্পনেট ব্যবহারকারীরা" সারণিকে "মাই ইউজারস" সারণীর সাথে প্রতিস্থাপন করা। নীচে কোড এবং তৈরি টেবিলের ডাটাবেস চিত্র দেখুন।

আমি প্রকৃতপক্ষে প্রতিটি AspNetটেবিলটি নিজের নামের সাথে প্রতিস্থাপন করতে চাই ... fxample, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles এবং মাই ব্যবহারকারীদের জন্য।

আমি কীভাবে এটি সম্পাদন করব এবং কেবলমাত্র এক টেবিলের সেট দিয়ে শেষ করব?

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
আপনার কোড এবং আমার মধ্যে পার্থক্য হ'ল আমি অ্যাপ্লিকেশন ব্যবহারকারীটির নাম "ব্যবহারকারী" রেখেছি। আমার আচরণ একদম আলাদা। প্রথমে তৈরি করার পরে এটি যেমন প্রয়োজন তেমন সারণি তৈরি করে এবং আমি যে নামগুলি উল্লেখ করেছি তা দিয়ে .... সম্ভবত "পরীক্ষা-নিরীক্ষার জন্য" অ্যাপ্লিকেশন ব্যবহারকারীকে ব্যবহারকারীর পরিবর্তনের চেষ্টা করুন এবং তারপরে লাইনগুলি বেস যুক্ত করুন nঅনমোডেলক্রিটিং (মডেলবিল্ডার); ModelBuilder.Entity <IdentityUser> () .ToTable ("ব্যবহারকারী", "dbo"); ModelBuilder.Entity <ApplicationUser> () .ToTable ("ব্যবহারকারী", "dbo");
পাইটর স্টুলিনস্কি

1
উপরে সমাধান আপডেট করা হয়েছে ...
ব্যবহারকারীর 2315985

6
@ দাশকুল মডেলবিল্ডার সরান ntমান্তি <IdentityUser> () o। টোটেবল ("মাইউজার্স") Property সম্পত্তি (পি => পি.আইডি) asহ্যাসকলামনাম ("ইউজারআইডি"); এবং সেক্ষেত্রে বৈষম্যমূলক কলামটি মাই ইউজারস টেবিলে যুক্ত হবে না। আরও তথ্যের জন্য এই ত্রুটিটি দেখুন: stackoverflow.com/questions/22054168/…
সের্গেই

1
@ ব্যবহারকারী 2315985 - আপনার উত্তরটি আপডেট করা উচিত @ সার্জি modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");দ্বারা উল্লিখিত লাইনটি সরাতে । অন্যথায়, নতুন নামযুক্ত MyUsersটেবিলটিতে @ দাসকুল নির্দেশিত হিসাবে বৈষম্যমূলক কলাম রয়েছে। এছাড়াও, আপনার MyUserClaimsটেবিলের কাঠামোটি ভুল হবে ভুলভাবে @ ম্যাট সামগ্রিকভাবে নির্দেশিত হিসাবে। আমি মনে করি এটি যুক্ত করার ধারণাটি একটি এমএসডিএন ব্লগে @ জিয়াংয়ের একটি মন্তব্য থেকে এসেছে , তবে এটি ভুল!
কিম্বাওদি

উত্তর:


125

আপনি নীচের অনুসারে আইডেন্টিটি মডেল.সি.কে সংশোধন করে সহজেই এটি করতে পারেন:

আপনার DbContext এ onModelCreating ওভাররাইড করুন তারপরে নিম্নলিখিতগুলি যুক্ত করুন, এটি AspNetUser টেবিলটিকে "ব্যবহারকারীদের" এ পরিবর্তন করবে আপনি ক্ষেত্রের নামও ডিফল্ট আইডি কলামটি ব্যবহারকারী_আইডি হয়ে যাবে।

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

বা কেবলমাত্র নীচে আপনি সমস্ত মানক কলামের নাম রাখতে চাইলে:

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

নীচের পুরো উদাহরণ (এটি আপনার আইডেন্টিটি মোডেল.সি ফাইলগুলিতে হওয়া উচিত) আমি আমার অ্যাপ্লিকেশন ব্যবহারকারী ক্লাসটি ব্যবহারকারী হিসাবে পরিবর্তন করেছি।

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

দয়া করে মনে রাখবেন যে বর্তমান সারণী বিদ্যমান থাকলে আমি এই কাজটি পরিচালনা করতে সক্ষম হইনি। এছাড়াও নোট করুন যে কোনও কলাম আপনি মানচিত্রযুক্ত করবেন না সেগুলি তৈরি করা হবে be

আশা করি এইটি কাজ করবে.


2
এই পরিবর্তনগুলি কার্যকর হওয়ার জন্য আপনাকে বিদ্যমান ডাটাবেসে পরিবর্তনগুলি ঠেকাতে মাইগ্রেশন ব্যবহার করতে হবে।
লুকাসজ

2
আপনি যদি এটি করেন তবে আপনার বিদেশী কীগুলি কিছুটা বিজোড় হবে, আমি মনে করি না যে আপনাকে আইডেন্টিটিউজারের সারণির নাম পরিবর্তন করতে হবে। এই এই পোস্টটি দেখুন
ম্যাট সার্বিকভাবে

এটি আগে যেমন আমাকে ধরা পড়েছিল ঠিক তেমন একটি অতিরিক্ত চেক। base.OnModelCreatingওভাররাইডে কলটি কোডের প্রথম লাইন কিনা তা নিশ্চিত করুন নইলে বাকী রেখাগুলি বেস আইডেন্টিটি ক্লাস দ্বারা ওভাররাইট করা হয়েছে।
ডেভিডজি

@ ডেভিডজি সত্যিই আপনাকে ধন্যবাদ
এস এ

ভাল সমাধান। তবে আইডেন্টিটিউজারের জন্য সারণির নামটি মুছে ফেলার দরকার নেই। এই সমাধান দেখুন 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

আপনি নিজের পছন্দের টেবিলটিতে মানচিত্র তৈরি করতে আপনার ডিবি কনটেক্সট ক্লাসে এই পদ্ধতিটি ওভাররাইড করার চেষ্টা করতে পারেন:

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

7
কল করতে ভুলবেন না base.OnModelCreating(modelBuilder);বা বাকি মডেলটি তৈরি হবে না।
ফেরুরসিও

@ হাও কুং এর সমাধান কার্যকর করার পরে আমি আমার প্রশ্ন আপডেট করেছি তবে সমস্যাটি অব্যাহত রয়েছে, দয়া করে উপরে আমার সম্পাদিত প্রশ্নটি দেখুন। ধন্যবাদ।
ব্যবহারকারী 2315985

1

আপনি কনফিগারেশন ক্লাসও তৈরি করতে পারেন এবং আপনার প্রতিটি পরিচয় শ্রেণির প্রতিটি বিবরণ নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ:

using System.Data.Entity.ModelConfiguration;

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

এবং তারপরে এই কনফিগারেশনগুলিকে অনমোডেলক্রিয়াটিং () পদ্ধতিতে অন্তর্ভুক্ত করুন:

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

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

এটি আপনাকে আইডেন্টিটি ক্লাসের প্রতিটি বিষয়ে সম্পূর্ণ নিয়ন্ত্রণ দেয় give


1

কেবলমাত্র ডকুমেন্টেশনের উদ্দেশ্যে, যিনি ভবিষ্যতে বছরের পর বছর এই পোস্টে আসেন, তার জন্য (আমার মত এক্সডি), আমার মন্তব্য দেওয়া সমস্ত উত্তর সঠিক, তবে আপনি তার ব্লগে আলেকজান্দ্রু বুকুর প্রদত্ত এই পদ্ধতিটি দিয়ে সহজভাবে প্রমাণ করতে পারবেন

         //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

আমরা এসপ নেট আইডেন্টিটি ডিফল্ট টেবিলের নামগুলি এর মতো পরিবর্তন করতে পারি:

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

তদুপরি আমরা প্রতিটি শ্রেণি প্রসারিত করতে পারি এবং 'আইডেন্টিটি ব্যবহারকারী', 'আইডেন্টিটি রোল', ...

    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
}

সময় বাঁচানোর জন্য আমরা সমস্ত শ্রেণি প্রসারিত করতে এস্পনেট আইডেন্টিটি ২.০ এক্সটেনসিবল প্রজেক্ট টেম্পলেট ব্যবহার করতে পারি ।


0

তবে এটি। নেট কোর (এমভিসি 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.