首页 > 解决方案 > 通过中间件管道播种数据库引发异常 asp.net core

问题描述

我的解决方案中有 3 层。核心、BLL 和 DAL 层。除了核心层是 Web API 层之外,所有这些都是类库。DAL 层具有上下文、播种器、迁移、实体和存储库类。我将 ASP.NET Core 3.0 预览版用于核心层,将 .net 标准 2.0 用于类库层。播种器类中的 Seed 方法是异步返回一个任务。当核心项目运行时,我得到这个异常:

在此处输入图像描述

当我删除 .Wait() 方法调用时,没有抛出异常并且 API 工作正常,但数据库没有播种。

我该如何解决?谢谢。

Startup.cs 中间件管道:

     public void Configure(IApplicationBuilder app, IWebHostEnvironment env, BlazeMartDbSeeder seeder)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //throws exception here
            seeder.Seed().Wait();

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });


        }

播种机类:

using BlazeMartManagementSystem.DAL.Entities;
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace BlazeMartManagementSystem.DAL
{
    public class BlazeMartDbSeeder
    {
        private RoleManager<IdentityRole> _roleMgr;
        private UserManager<ApplicationUser> _userMgr;

        public BlazeMartDbSeeder(UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
        {
            _userMgr = userMgr;
            _roleMgr = roleMgr;
        }

        public async Task Seed()
        {
            var user = await _userMgr.FindByNameAsync("Raj");

            // Add User
            if (user == null)
            {
                if (!(await _roleMgr.RoleExistsAsync("Manager")))
                {
                    var role = new IdentityRole("Manager");
                    await _roleMgr.AddClaimAsync(role, new Claim(type: "IsManager", value: "True"));
                    await _roleMgr.CreateAsync(role);
                    //  role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });

                }

                user = new ApplicationUser
                {
                    UserName = "raj",
                    FirstName = "Raj",
                    LastName = "Narayanan",
                    Email = "raj@raj.com"
                };

                var userResult = await _userMgr.CreateAsync(user, "Asp3raj");
                var roleResult = await _userMgr.AddToRoleAsync(user, "Manager");
                var claimResult = await _userMgr.AddClaimAsync(user, new Claim("GreenBadge", "True"));

                if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
                {
                    throw new InvalidOperationException("Failed to build user and roles");
                }
            }

            user = await _userMgr.FindByNameAsync("Shawnw");

            // Add User
            if (user == null)
            {
                if (!(await _roleMgr.RoleExistsAsync("Employee")))
                {
                    var role = new IdentityRole("Employee");
                    await _roleMgr.AddClaimAsync(role, new Claim(type: "IsEmployee", value: "True"));
                    await _roleMgr.CreateAsync(role);
                    //  role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });

                }

                user = new ApplicationUser
                {
                    UserName = "shawnw",
                    FirstName = "Shawn",
                    LastName = "Wildermuth",
                    Email = "shawnw@s.com"
                };

                var userResult = await _userMgr.CreateAsync(user, "P@ssw0rd!");
                var roleResult = await _userMgr.AddToRoleAsync(user, "Employee");
                var claimResult = await _userMgr.AddClaimAsync(user, new Claim("OrangeBadge", "True"));

                if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
                {
                    throw new InvalidOperationException("Failed to build user and roles");
                }
            }

            user = await _userMgr.FindByNameAsync("John");

            // Add User
            if (user == null)
            {
                if (!(await _roleMgr.RoleExistsAsync("Vendor")))
                {
                    var role = new IdentityRole("Vendor");
                    await _roleMgr.AddClaimAsync(role, new Claim(type: "IsVendor", value: "True"));
                    await _roleMgr.CreateAsync(role);
                    //  role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });

                }

                user = new ApplicationUser
                {
                    UserName = "johng",
                    FirstName = "John",
                    LastName = "Galli",
                    Email = "gali@gali.com"
                };

                var userResult = await _userMgr.CreateAsync(user, "P@ssw0rd!");
                var roleResult = await _userMgr.AddToRoleAsync(user, "Vendor");
                var claimResult = await _userMgr.AddClaimAsync(user, new Claim("BlueBadge", "True"));

                if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
                {
                    throw new InvalidOperationException("Failed to build user and roles");
                }
            }

        }
    }
}

标签: asp.net-identityasp.net-core-webapiasp.net-core-3.0

解决方案


您可以尝试定义播种器类,如下所示:

public static class BlazeMartDbSeeder
{
    public static void Seed(UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
    {
        //var user =  userMgr.FindByNameAsync("Raj");

        // Add User
        if (userMgr.FindByNameAsync("Raj").Result == null)
        {
            if (!( roleMgr.RoleExistsAsync("Manager").Result))
            {
                IdentityRole role = new IdentityRole();
                role.Name = "Manager";
                IdentityResult result = roleMgr.CreateAsync(role).Result;
                IdentityResult claim=roleMgr.AddClaimAsync(role, new Claim(type: "IsManager", value: "True")).Result;

                //  role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });

            }

            ApplicationUser user = new ApplicationUser
            {
                UserName = "raj",
                FirstName = "Raj",
                LastName = "Narayanan",
                Email = "raj@raj.com"
            };

            IdentityResult userResult =  userMgr.CreateAsync(user, "Asp3raj#").Result;
            IdentityResult roleResult =  userMgr.AddToRoleAsync(user, "Manager").Result;
            IdentityResult claimResult =  userMgr.AddClaimAsync(user, new Claim("GreenBadge", "True")).Result;

            if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
            {
                throw new InvalidOperationException("Failed to build user and roles");
            }
        }

        //user =  userMgr.FindByNameAsync("Shawnw");

        // Add User
        if (userMgr.FindByNameAsync("Shawnw").Result == null)
        {
            if (!(roleMgr.RoleExistsAsync("Employee").Result))
            {
                IdentityRole role = new IdentityRole();
                role.Name = "Employee";
                IdentityResult result=roleMgr.CreateAsync(role).Result;
                IdentityResult claim =roleMgr.AddClaimAsync(role, new Claim(type: "IsEmployee", value: "True")).Result;

                //  role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });

            }

            ApplicationUser user = new ApplicationUser
            {
                UserName = "shawnw",
                FirstName = "Shawn",
                LastName = "Wildermuth",
                Email = "shawnw@s.com"
            };

            IdentityResult userResult = userMgr.CreateAsync(user, "P@ssw0rd!").Result;
            IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Employee").Result;
            IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("OrangeBadge", "True")).Result;

            if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
            {
                throw new InvalidOperationException("Failed to build user and roles");
            }
        }

        // user =  userMgr.FindByNameAsync("John");

        // Add User
        if (userMgr.FindByNameAsync("John").Result == null)
        {
            if (!(roleMgr.RoleExistsAsync("Vendor").Result))
            {
                IdentityRole role = new IdentityRole();
                role.Name = "Vendor";
                IdentityResult result = roleMgr.CreateAsync(role).Result;
                IdentityResult claim= roleMgr.AddClaimAsync(role, new Claim(type: "IsVendor", value: "True")).Result;

                //  role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });

            }

            ApplicationUser user = new ApplicationUser
            {
                UserName = "johng",
                FirstName = "John",
                LastName = "Galli",
                Email = "gali@gali.com"
            };

            IdentityResult userResult = userMgr.CreateAsync(user, "P@ssw0rd!").Result;
            IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Vendor").Result;
            IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("BlueBadge", "True")).Result;

            if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
            {
                throw new InvalidOperationException("Failed to build user and roles");
            }
        }

    }
}

启动.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        BlazeMartDbSeeder.Seed(userMgr, roleMgr);

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

注意:密码的组成部分包含大小写字母、数字和特殊符号。

关于 ASP.NET Core Identity 中的种子用户和角色数据,可以参考这里


推荐阅读