نقش کاربر با استفاده Dependency Injection ، در این مقاله نحوه ی نمایش منو پویای مبتنی بر نقش را، پس از اینکه کاربر  وارد سیستم می شود، با جزئیات خواهیم دید.

برای این کار، یک جدول Menu Master ایجاد و چند رکورد برای نمایش منو درج کرده و URL (نشانی اینترنتی) را به منو بر اساس نقش کاربر وارد شده پیوند خواهیم داد.

پیش از اینکه این مقاله را شروع کنیم، لطفا مقاله ی قبلی ما را مطالعه فرمایید.

در مقاله ی قبلی مان، نحوه ی بکارگیری ASP.NET Core Identity را در MVC Application برای ایجاد نقش کاربران و نمایش منو بسته به نقش کاربران را با جزئیات مورد بحث قرار دادیم.

در اینجا، خواهیم دید که چگونه:

  •  مدیر پیش فرض و کاربران مدیر را ایجاد کنیم.
  •  جدول MenuMaster را ایجاد و چند رکورد ساده برای نقش های Admin و Manager جهت نمایش منوها درج کنیم.
  • کاربران احراز هویت نشده را به صفحه ی ورود به سیتسم هدایت کنیم.
  • منو را بصورت پویا بر اساس کاربر وارد شده نمایش دهیم.

پیش نیازها

اطمینان حاصل کنید که تمامی پیش نیازها را در کامپیوتر خود نصب کرده باشید. اگر نه، تمامی آن ها را، یک به یک، دانلود و نصب کنید.

  1.  نخست، ویژوال استودیو ۲۰۱۷ را از این لینک دانلود و نصب کنید.
  2.  SQL Server 2014 یا بالاتر

نقش کاربر

برای این کار، یک جدول Menu Master ایجاد و چند رکورد برای نمایش منو و URL (نشانی اینترنتی) به منو بر اساس نقش کاربر وارد شده درج خواهیم کرد.

نقش کاربر

نقش کاربر

بکارگیری کد

مرحله ۱ : ایجاد یک پایگاه داده

این مقاله ادامه ی مقاله ی قبلی ماست؛ همانطور که به شما گفته ایم، از یک Common Database هم برای جداول ASP.NET Identity و هم برای جدول های جدید خودمان استفاده خواهیم کرد.

در مقاله ی قبلی مان، در رابطه با ایجاد نقش کاربران توضیح دادیم، و در اینجا برای مدیریت منو بر اساس نقش، نیاز است یک جدول رابطه بین جدول ASP.NET Roles و جدول منوی خودمان ایجاد کنیم.

بیایید نحوه ی ایجاد Menu Table جدیدمان را که رابطه ای با جدول ASP.NET Identity AspNetRoles دارد، با جزئیات ببینیم.

در اینجا، می توانیم فیلدهای مورد استفاده برای MenuMaster را مشاهده کنیم:

نقش کاربر

نقش کاربر

در ابتدا، پایگاه داده ای را ایجاد و رشته ی اتصال را در فایل appsettings.json برای DefaultConnection با اتصال جدید پایگاه داده مان تنظیم خواهیم کرد.

ایجاد پایگاه داده

اسکریپت زیر را برای ایجاد جدول MenuMaster پایگاه داده مان و اسکریپت نمونه ی درج ردیف های Menu اجرا کنید.

USE MASTER         
GO         
         
-- ۱) Check for the Database Exists .If the database is exist then drop and create new DB         
IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'AttendanceDB' )         
DROP DATABASE AttendanceDB         
GO         
         
CREATE DATABASE AttendanceDB         
GO         
          
  
USE AttendanceDB      
GO      
    
IF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'MenuMaster' )      
DROP TABLE MenuMaster      
GO      
      
CREATE TABLE MenuMaster      
(      
   MenuIdentity int identity(1,1),      
   MenuID VARCHAR(30)  NOT NULL,      
   MenuName VARCHAR(30)  NOT NULL,    
   Parent_MenuID  VARCHAR(30)  NOT NULL,    
   User_Roll [varchar](256) NOT NULL,     
   MenuFileName VARCHAR(100) NOT NULL,       
   MenuURL VARCHAR(500) NOT NULL,      
   USE_YN Char(1) DEFAULT 'Y',      
   CreatedDate datetime      
CONSTRAINT [PK_MenuMaster] PRIMARY KEY CLUSTERED            
(           
  [MenuIdentity] ASC   ,      
  [MenuID] ASC,      
  [MenuName] ASC        
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]           
) ON [PRIMARY]         
     
select * from MenuMaster    
-- Insert Admin User Details  
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('AUSER','ADMIN Dashboard','*','ADMIN','INDEX','ADMINC','Y',getDate())    
 Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('AAbout','About Admin','*','ADMIN','INDEX','ADMINAC','Y',getDate())     
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('LStock','Live Stock','AUSER','ADMIN','INDEX','StockC','Y',getDate())       
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('Profile','User Details','AUSER','ADMIN','INDEX','MemberC','Y',getDate())     
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('MUSER','Manager Dashboard','*','ADMIN','INDEX','ManagerC','Y',getDate())    
 Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('MAbout','About Manager','*','ADMIN','INDEX','ManagerAC','Y',getDate())     
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('Accounts','Account Details','MUSER','ADMIN','INDEX','AccountC','Y',getDate())      
    Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('Inventory','Inventory Details','MUSER','ADMIN','INDEX','InventoryC','Y',getDate())    
  
-- Insert Manager User Details   
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('MUSER','Manager Dashboard','*','Manager','INDEX','ManagerC','Y',getDate())    
 Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('MAbout','About Manager','*','Manager','INDEX','ManagerAC','Y',getDate())     
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('Accounts','Account Details','MUSER','Manager','INDEX','AccountC','Y',getDate())       
Insert into MenuMaster(MenuID ,MenuName,Parent_MenuID,User_Roll,MenuFileName,MenuURL,USE_YN,CreatedDate)  
    Values('Inventory','Inventory Details','MUSER','Manager','INDEX','InventoryC','Y',getDate())     
  
  
select * from MenuMaster   
  
select * from AspnetUserRoles  
--Here we can see the format we are using in our Menu Master table to insert our records for display menu based on user role.  
  • MenuID = ‘AUSER :  شناسه ی منوی منحصر بفردی خواهیم داد
  •  MenuName = ‘ADMIN Dashboard’ (متن نمایش منو را خواهیم داد)
  •  ParentMenuID = ‘*’ ( اگر این منوی اصلی باشد، در اینجا یک “*” خواهیم داد، در غیر اینصورت MenuID مربوط به رکوردهای قبلی را برای نمایش این رکورد خواهیم داد تا به عنوان زیرمنو نشان دهد)
  •  User_Role = ‘ADMIN’ (در اینجا User Role را خواهیم داد، اگر نیاز است منوی یکسانی برای چندین کاربر بر اساس نقش استفاده شود، مانند Admin، Manager، Accountant و …، جزئیات همان منو را با نقش کاربرهای متفاوت درج خواهیم کرد. در نمونه مان، جزئیات منوی یکسان ‘Manager Dashboard’ را هم برای Admin و هم برای Manager User اضافه کرده ایم از آنجاییکه هردو می توانند منو و صفحه را مشاهده کنند.)
  •  MenuFileName = ‘INDEX’ (در اینجا، نام View خود را جهت نمایش هنگامیکه منو کلیک می شود، خواهیم داد)
  •  MenuURL = ‘ADMINC’ (در اینجا، نام Controller خود را جهت نمایش هنگامیکه منو کلیک می شود، خواهیم داد)
  • USE_YN = ‘Y’ (این فیلد اختیاری است از آنجاییکه می توانیم آن را برای نمایش یا عدم نمایش منو استفاده کنیم)
  •  CreateDate = getDate() (این نیز اختیاری است)

در این برنامه ی نمایشی، تمامی کنترل کننده های مورد نیاز و دیدگاه ها را جهت نمایش، هنگامیکه کاربر بر روی منو کلیک می کند، از قبل داریم.

مرحله ۲ : ایجاد ASP.NET Core خود

پس از نصب ویژوال استودیو ۲۰۱۷ خود، start را کلیک کرده، سپس programs و انتخاب Visual Studio 2017 – Visual Studio 2017 را کلیک کنید.

New، سپس Project را کلیک کرده، Web و سپس ASP.NET Core Web Application را انتخاب کنید. نام پروژه ی خود را وارد کرده و کلیک کنید.

نقش کاربر

نقش کاربر

( Web Application(Model-View-Controller را انتخاب و بر روی Change Authentication کلیک کنید.

نقش کاربر

نقش کاربر

Individual User Accounts را انتخاب و ok را برای ایجاد پروژه ی خود کلیک کنید.

نقش کاربر

نقش کاربر

بروزرسانی appsettings.json

در فایل appsettings.json می توانیم رشته ی اتصال DefaultConnection را بیابیم.

اینجا در رشته ی اتصال، SQL Server Name، UID و PWD خود را برای ایجاد و ذخیره ی تمامی جزئیات کاربران در یک پایگاه داده تغییر دهید.

"ConnectionStrings": {  
    "DefaultConnection": "Server= YOURSERVERNAME;Database=InventoryDB;user id= YOURSQLUSERID;password=YOURSQLPASSWORD;Trusted_Connection=True;MultipleActiveResultSets=true"  
  },  

مرحله ۳ – افزودن Identity Service در فایل Startup.cs

بطور پیش فرض، در برنامه ی ASP.NET Core شما، Identity Service در فایل Startup.cs / متد ConfigureServices اضافه خواهد شد.

همچنین می توانید علاوه بر آن، قدرت رمز عبور را در حالی که کاربر ثبت نام می کند اضافه کنید و نیز صفحه ی ورود به سیستم/صفحه ی خروج از سیستم پیش فرض و همچنین AccessDeniedPath را از طریق بکارگیری کد زیر تنظیم کنید.

services.AddIdentity<ApplicationUser, IdentityRole>()  
                .AddEntityFrameworkStores<ApplicationDbContext>()  
                .AddDefaultTokenProviders();  
  
            //Password Strength Setting  
            services.Configure<IdentityOptions>(options =>  
            {  
                // Password settings  
                options.Password.RequireDigit = true;  
                options.Password.RequiredLength = 8;  
                options.Password.RequireNonAlphanumeric = false;  
                options.Password.RequireUppercase = true;  
                options.Password.RequireLowercase = false;  
                options.Password.RequiredUniqueChars = 6;  
  
                // Lockout settings  
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);  
                options.Lockout.MaxFailedAccessAttempts = 10;  
                options.Lockout.AllowedForNewUsers = true;  
  
                // User settings  
                options.User.RequireUniqueEmail = true;  
            });  
  
            //Seting the Account Login page  
            services.ConfigureApplicationCookie(options =>  
            {  
                // Cookie settings  
                options.Cookie.HttpOnly = true;  
                options.ExpireTimeSpan = TimeSpan.FromMinutes(30);  
                options.LoginPath = "/Account/Login"; // If the LoginPath is not set here, ASP.NET Core will default to /Account/Login  
                options.LogoutPath = "/Account/Logout"; // If the LogoutPath is not set here, ASP.NET Core will default to /Account/Logout  
                options.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath is not set here, ASP.NET Core will default to /Account/AccessDenied  
                options.SlidingExpiration = true;  
            });  

مرحله ۴ – ثبت و ایجاد کاربران

اکنون برنامه ی وب ASP.NET Core ما برای ثبت نام کاربران در وبسایت مان آماده است و همچنین کاربران می توانند پس از ثبت نام وارد سیستم مان شوند.

Authorization را از طریق افزودن نقش ها به کاربران در مراحل بعدی انجام خواهم داد.

برنامه ی خود را برای ثبت اولین کاربر Admin پیش فرض ساخته و اجرا کنید.

نقش کاربر

نقش کاربر

در اینجا، دو کاربر را یکی به عنوان Admin و کاربر دیگر را به عنوان Manager ثبت خواهیم کرد.

از این کاربر جهت افزودن نقش ها استفاده خواهیم کرد. ۲ کاربر بصورت syedshanumcain@gmail.com و afraz@gmail.com ایجاد خواهیم کرد.

نکته: می توانید کاربران را بر اساس نیاز خود ایجاد کرده و جزئیات کاربر را در کد startup برای افزودن نقش ها به کاربران تغییر دهید.

نقش کاربر

نقش کاربر

نوسازی (refresh) پایگاه داده

هنگامی که پایگاه داده ی خود را نوسازی می کنیم، می توانیم مشاهده کنیم که تمامی جدول های Identity ایجاد شده اند.

نقش کاربر

نقش کاربر

مرحله ۵ – ایجاد Role و تخصیص User برای Role

از متد زیر برای ایجاد Role های جدیدی به عنوان “Admin” و “Manager” استفاده می کنیم؛ کاربران ثبت شده ی اخیر را به عنوان “Admin” و “Manager” به وب سایت مان اختصاص خواهیم داد.

فایل Startup.cs را باز کرده و این متد را در فایل Startup.cs خود اضافه کنید.

private async Task CreateUserRoles(IServiceProvider serviceProvider)  
    {  
        var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();  
        var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();  
  
        IdentityResult roleResult;  
        //Adding Addmin Role    
        var roleCheck = await RoleManager.RoleExistsAsync("Admin");  
        if (!roleCheck)  
        {  
            //create the roles and seed them to the database    
            roleResult = await RoleManager.CreateAsync(new IdentityRole("Admin"));  
        }  
  
        roleCheck = await RoleManager.RoleExistsAsync("Manager");  
        if (!roleCheck)  
        {  
            //create the roles and seed them to the database    
            roleResult = await RoleManager.CreateAsync(new IdentityRole("Manager"));  
        }  
  
        //Assign Admin role to the main User here we have given our newly loregistered login id for Admin management    
        ApplicationUser user = await UserManager.FindByEmailAsync("syedshanumcain@gmail.com");  
        var User = new ApplicationUser();  
        await UserManager.AddToRoleAsync(user, "Admin");  
  
        user = await UserManager.FindByEmailAsync("Afraz@gmail.com");  
        await UserManager.AddToRoleAsync(user, "Manager");  
  
    }  

از فایل Startup.cs، می توانیم متد Configure را بیابیم.

متد CreateUserRoles خود را از این متد Configure فراخوانی می کنیم.

هنگامی که برنامه ی خود را ساخته و اجرا می کنیم، می توانیم مشاهده کنیم که Role های جدیدی به عنوان “Admin” و “Manager” در جدول ASPNetRole ایجاد خواهند شد.

مرحله ۶ – ایجاد صفحه ی Admin/Manager و تنظیم Authorization

اکنون یک کاربر Admin/Manager برای برنامه ی وب ASP.NET Core خود داریم.

به عنوان مرحله ی بعدی، بیایید Controller ها و نمایه ها (view) را جهت نمایش بر اساس ورود کاربر ایجاد کنیم.

در مثال قبلی مان، نحوه ی تنظیم Authorization برای نقش ها در هر صفحه را دیدیم.

با استفاده از آن، تمامی Controllerها و Viewهای خود را ایجاد خواهیم کرد.

در برنامه ی نمایشی ضمیمه شده ی نمونه می توانید تمامی کنترل کننده ها و نمایه ها را که ایجاد کرده ایم یافته و موارد دیگری را بر حسب نیاز خود ایجاد کنید.

مرحله ۷ – کار با تزریق وابستگی برای نمایش منو

ایجاد کلاس مدل

ابتدا، با ایجاد یک کلاس در پوشه ی Model خود شروع خواهیم کرد.

نام کلاس را بصورت MenuMaster مشابه با نام جدول خود در پایگاه داده مان قرار می دهیم.

در کلاس MenuMaster ، نیاز است ویژگی هایی مانند فیلدهای Table خود مانند زیر ایجاد کنیم.

public class MenuMaster  
    {  
        [Key]  
        public int MenuIdentity { get; set; }  
        public string MenuID { get; set; }  
        public string MenuName { get; set; }  
        public string Parent_MenuID { get; set; }  
        public string User_Roll { get; set; }  
        public string MenuFileName { get; set; }  
        public string MenuURL { get; set; }  
        public string USE_YN { get; set; }  
        public DateTime CreatedDate { get; set; }  
    }  

ایجاد کلاس رابط

حال زمان این است که یک رابط با متدی به نام (GetMenuMaster()، GetMenuMaster(StringUserRole ایجاد کنیم و این رابط را در Service خود پیاده سازی می کنیم تا تمامی جزئیات Menu را از جدول گرفته و نیز متدی دیگر تا منو را از طریق تقش کاربر بگیریم. برای ایجاد Interface (رابط)، کلاسی جدید به پوشه ی مدل خود افزوده و نام کلاس را “IMenuMasterService” بگذارید.

کلاس را به یک رابط تغییر خواهیم داد از آنجاییکه می خواهیم رابطی جهت پیاده سازی در سرویس مان ایجاد کنیم.

public interface IMenuMasterService  
    {  
        IEnumerable<MenuMaster> GetMenuMaster();  
        IEnumerable<MenuMaster> GetMenuMaster(String UserRole);  
     }  
 

ایجاد Service

اکنون، بیایید کلاسی به پوشه ی Services اضافه کرده و نام کلاس را بصورت “MenuMasterService” قرار دهیم.

در این کلاس، رابط IMenuMasterService خود را پیاده سازی خواهیم کرد. می دانیم که اگر رابط را پیاده سازی کنیم، باید متد رابط را در کلاس خود تعریف کنیم.

در این سرویس، متد رابط را بکار گرفته و لیستی با جزئیات Menu و همچنین جزئیات Menu را از طریق نقش کاربر باز می گردانیم.

این مورد را بطور مستقیم در صفحه ی View خود تزریق (Inject) خواهیم کرد.

public class MenuMasterService:IMenuMasterService  
    {  
        private readonly ApplicationDbContext _dbContext;  
  
        public MenuMasterService(ApplicationDbContext dbContext)  
        {  
            _dbContext = dbContext;  
        }  
  
        public IEnumerable<MenuMaster> GetMenuMaster()  
        {   
            return _dbContext.MenuMaster.AsEnumerable();  
  
        }   
  
        public IEnumerable<MenuMaster> GetMenuMaster(string UserRole)  
        {    
            var result = _dbContext.MenuMaster.Where(m => m.User_Roll == UserRole).ToList();    
            return result;  
        }  
    }  

ثبت Service

نیاز است سرویس ایجاد شده ی خود را در نگهدارنده ثبت کنیم. Startup.cs را از پروژه ی خود جهت افزودن سرویس به نگهدارنده باز کنید.

در کلاس Startup.cs، متدی به نام ConfigureServices را یافته و سرویس “MenuMasterService” خود را مانند خط زیر اضافه کنید.
services.AddTransient<MenuMasterService, MenuMasterService>();

تزریق Service در صفحه ی  Layout.cshtml

حال، بسیار ساده تر و آسان تر است چراکه می توانیم بطور مستقیم سرویس را در صفحه ی View خود تزریق کرده و تمامی نتایج را به صفحه ی نمایه ی خود متصل کنیم.

جهت تزریق Service در View خود، در اینجا از صفحه ی  Layout.cshtml موجود خود استفاده خواهیم کرد.

از آنجایی که منو را در بالای وبسایت خود نمایش خواهیم داد و در تمام صفحات خود از آن استفاده خواهیم کرد، در اینجا از صفحه ی Layout.cshtml استفاده کرده ایم تا نتایج منو را به عنوان منویی بر اساس کاربری که وارد سیستم شده، متصل کنیم.

در اینجا ابتدا بررسی می کنیم که آیا کاربر برای وب سایت ما احراز هویت شده است، سپس اگر کاربر وارد سیستم شده باشد، جزئیات نقش کاربر وارد شده را گرفته و منو را بر اساس نقش کاربران متصل می کنیم.

در اینجا ۲ سطح منو بصورت Main Menu و Submenu را متصل می کنیم.

در نتیجه ی جدول خود، تمامی Parent_MenuID = “*” را بررسی می کنیم چراکه منوی اصلی را با parent MenuID بصورت “*” نمایش خواهیم داد و در حلقه ی داخلی بعدی، زیرمنوی مناسب منوی اصلی را نمایش خواهیم داد.


<div class="navbar-collapse collapse">
  
 
<ul class="nav navbar-nav">  
   
<li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>

  
 @if (User.Identity.IsAuthenticated)  
        {  
            var UserRoles = "";  
            if (@User.IsInRole("Admin"))  
            {  
                UserRoles = "Admin";  
            }  
            else  
            {  
                UserRoles = "Manager";  
            }  
  
                @if (menus.GetMenuMaster(@UserRoles).Any())  
                {  
                @if (menus.GetMenuMaster(@UserRoles).Any())  
                {  
                @foreach (var menuNames in menus.GetMenuMaster(@UserRoles).Where(n => n.Parent_MenuID == "*"))  
                {  
                        
<li>  
                            <a asp-area="" asp-controller=@menuNames.MenuURL asp-action=@menuNames.MenuFileName>@menuNames.MenuName</a>  

<ul class="sub-menu">  
                                @foreach (var subMenu in menus.GetMenuMaster(@UserRoles).Where(n => n.Parent_MenuID == @menuNames.MenuID))  
                                  {  
                                    
<li>  
                                        <a asp-area="" asp-controller=@subMenu.MenuURL asp-action=@subMenu.MenuFileName>@subMenu.MenuName</a>  
                                    </li>

  
                                   }  
                            </ul>

  
                            </li>

  
                }  
                }  
                }  
            }  
  </ul>

  

نقش کاربر

نقش کاربر

نتیجه گیری

نخست، یک نمونه AttendanceDB Database در SQL Server خود ایجاد کرده و اسکریپت را جهت ایجاد جدول MenuMaster و درج رکوردهای نمونه اجرا کنید.

در فایل appsettings.json، رشته ی اتصال DefaultConnection را با SQL Server Connections خود عوض کنید.

در فایل Startup.cs تمامی کدها را همانطور که در این مقاله مورد بحث قرار دادیم اضافه کنید.

این یک برنامه ی نمایشی ساده است و از آنجایی که نقش های Admin و Manager را ثبت کرده ایم، می توانید بر اساس نیاز خود تغییر دهید.

همچنین طراحی CSS برای منو و زیرمنو مناسب سازگاری موبایل نیست، بنابراین می توانید طراحی بوتسترپ (bootstrap) خود را جهت پیاده سازی استایل منوی خود اضافه کنید.

زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    حسین پاسخ

    پیشنهاداها: در مرحله 4 باید دستورات
    pm>addmigration init
    pm>update-database
    و مطلب بعدی در قسمت 5 زمانی متد CreateUserRoles خود را از این متد Configure فراخوانی می کنیم. هیچ نقشی به بانک اضافه نمیشود