• 1399/09/16

seed data در Identity :

سلام خسته نباشید بنده میخواستم بدونم برای دیتای اولیه باید چگونه عمل کرد ؟ 

به صورت عادی اگر عمل کنیم چطوری باید پسورد رو Hash کنیم و مثلا مقام اش رو تعیین کنیم . 

بالاخره یک یوزر اولیه باید باشه با مقام ادمین . 

تشکر 

  • 1399/09/16
  • ساعت 14:29

سلام عزیز.

میتونید Usermanager رو دریافت کنید از طریق کانستراکتور یا از طریق ServiceProvider و سپس از طریق Usermanager که دریافت کردید کاربر موردنظرتون رو به دیتابیس اضافه کنید.

به شخصه این روش رو انجام میدم.


  • 1399/09/16
  • ساعت 14:45

توی کلاس استارتاپ مثلا ؟ 
یا program ؟

چون باید یک بار فقط اجرا بشه دیگه

 


  • 1399/09/16
  • ساعت 14:52

ما این کار رو انجام میدیم ( نمونه ساده شده هستش ) :

یک کلاس SeedDatabase داریم :

    public class SeedDatabase
    {
       
        public static async Task InitializeAsync(IServiceProvider serviceProvider)
        {
            var dbContext = serviceProvider.GetRequiredService<ApplicationDbContext>();
            var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
            var configuration = serviceProvider.GetRequiredService<IConfiguration>();
            }
         }

توی این کلاس یه متود استاتیک هستش یه میاد IServiceProvider  رو دریافت میکنه. ما از طریق این IServiceProvider میایم سرویس های مورد نظرمون رو دریافت میکنیم.

و برای استفاده از این متود استاتیک، توی کلاس Program متود Main رو به این شکل تغییر میدیم :

public static void Main(string[] args)
        {
            var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

            logger.Debug("init main");
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                try
                {
                    var services = scope.ServiceProvider;

                    SeedDatabase.InitializeAsync(services).GetAwaiter().GetResult();
                }
                catch (Exception e)
                {
                    //NLog: catch setup errors
                    logger.Fatal(e, "Stopped program because of exception");
                    throw;
                }
            }

            host.Run();
        }

البته ما از Nlog استفاده میکنیم برای لاگ زدن شما میتونید اینو عوض کنید.

الان موقع استارت پروژه این متود استاتیکی که ساختیم فراخونده میشه و شما میتونید توی اون متود چک کنید اگر دیتابیس خالی بودش اطلاعات رو بهش اضافه کنید.


  • 1399/09/16
  • ساعت 14:56

مرسی تشکر 

فقط یک سوال میخواستم بدونم آیا این لینک میتونه مفید باشه چون کاری که گفتین در واقع از استاندارد کار یکم دوره برای همین 

 

https://stackoverflow.com/questions/50785009/how-to-seed-an-admin-user-in-ef-core-2-1-0

 

فک کنم اگه طبق این روش عمل کنیم میتونیم در حد نیاز (user, role ) رو اضافه کنیم فقط بحث Hash کردن پسورد میمونه ..

 کلاسی یا متدی برای این کار وجود داره ؟ 


  • 1399/09/16
  • ساعت 15:05

این روشی که من معرفی کردم روش استفاده شده توسط :

https://github.com/jasontaylordev/NorthwindTraders

هستش که بالای 4 هزار استار دریافت کرده توی گیت هاب و منبع بسیار مفیدی هستش برای این موارد.

باز هم پیشنهاد میکنم از Usermanager استفاده کنید برای اینکار، در غیر این صورت باید برید کدهای Usermanager رو بررسی کنید و ببینید چگونه پسورد رو هش میکنه.


  • 1399/09/16
  • ساعت 16:17

کار کرد بسیار متشکرم

 


  • 1399/09/16
  • ساعت 16:29

خواهش میکنم، موفق باشید.


logo-enamadlogo-samandehi