c# - ASP.NET আইডেন্টিটি ব্যবহার করার সময় আমি কিভাবে টেবিলের নাম পরিবর্তন করতে পারি?




asp.net-identity (5)

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

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

যখন আমি একটি নতুন ব্যবহারকারী নিবন্ধন করি (ডিফল্ট টেমপ্লেট ব্যবহার করে), এই টেবিলগুলি (উপরে তালিকাবদ্ধ) তৈরি করা হয় এবং AspNetUsers টেবিলটিতে একটি রেকর্ড রয়েছে যা রয়েছে:

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

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

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

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

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

আমি আসলেই নিজের নামের সাথে প্রতিটি AspNet টেবিল প্রতিস্থাপন করতে চাই ... Fxample, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles এবং MyUsers এর জন্য।

আমি কিভাবে এই কাজ এবং শেষ টেবিল এক সেট সঙ্গে শেষ করবেন?

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

Answers

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

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

এটি আপনাকে পরিচয় শ্রেণীর প্রতিটি দিকের উপর সম্পূর্ণ নিয়ন্ত্রণ দেবে।


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

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

আপনি নীচের হিসাবে IdentityModel.cs সংশোধন করে সহজেই এটি করতে পারেন:

অনুলিপি করুন আপনার DbContext এ তৈরি করার পরে নিম্নলিখিতটি যুক্ত করুন, এটি "ব্যবহারকারীদের" এপননেট ইউসার টেবিলটি পরিবর্তন করবে, আপনি ক্ষেত্রের নামগুলিও পরিবর্তন করতে পারেন ডিফল্ট আইডি কলামটি 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");
        }
    }

বর্তমান টেবিল বিদ্যমান থাকলে আমি এই কাজ পেতে পরিচালিত না দয়া করে নোট করুন। এছাড়াও আপনি যে কলামগুলি ডিফল্ট ম্যাপ করবেন না তা নোট করুন।

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


আমরা এপিএইচটি আইডেন্টিটি ডিফল্ট টেবিলের নাম পরিবর্তন করতে পারি:

    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
}

সময় বাঁচাতে আমরা সব ক্লাস প্রসারিত করতে অ্যাসপানেট আইডেন্টিটি 2.0 এক্সটেনসিবল প্রজেক্ট টেমপ্লেট ব্যবহার করতে পারি।


আপনি যদি ASP.NET MVC কন্ট্রোলারে কোডিং করেন তবে ব্যবহার করুন

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

User.Identity.IsAuthenticated এবং User.Identity.Name User.Identity.IsAuthenticated উল্লেখ করে মূল্য উল্লেখ করা হয়েছে উপরের উল্লিখিত বিবৃতি যোগ ছাড়া কাজ করবে। কিন্তু GetUserId() এটি ছাড়া উপস্থিত হবে না।

যদি আপনি কন্ট্রোলার ছাড়া অন্য কোনও শ্রেণীতে থাকেন তবে ব্যবহার করুন

HttpContext.Current.User.Identity.GetUserId();

MVC 5 এর ডিফল্ট টেমপ্লেটে, ব্যবহারকারী আইডি একটি স্ট্রিং হিসাবে সংরক্ষিত একটি GUID।

কোনও সর্বোত্তম অনুশীলন এখনো নেই, তবে ব্যবহারকারী প্রোফাইল প্রসারিত করার জন্য কিছু মূল্যবান তথ্য পাওয়া গেছে:





c# asp.net-identity