繁体   English   中英

如何使用IdentityUser作为外键在SQL数据库中设置值?

[英]How to seed values in a SQL database using IdentityUser as a foreign key?

说明:

我使用一个名为Seeds的静态类,它使用Program.cs中的数据样本为我的数据库设定种子:

public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

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

                // Create/Seed the database
                Seeds.SeedDatabase(services);

                // Create the roles for the application
                var serviceProvider = services.GetRequiredService<IServiceProvider>();
                var configuration = services.GetRequiredService<IConfiguration>();
                Seeds.CreateRoles(serviceProvider, configuration).Wait();
            }

            host.Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>();
    }

这是种子:

public class Seeds
    {
public static void SeedDatabase(IServiceProvider serviceProvider)
        {
            // Seed DB
            using (var _db = new AppDbContext(serviceProvider.GetRequiredService<DbContextOptions<AppDbContext>>()))
            {
                Console.WriteLine("\n Looking for a database... \n");

                // Look for a database
                if (!_db.Database.EnsureCreated())
                {
                    // Debug message
                    string message = "\n There is already a database. \n";
                    Console.WriteLine(message);

                    // DB has been seeded before
                }
                else
                {
                    // Debug message
                    string message = "\n A new database has been created. \n";
                    Console.WriteLine(message);

                     _db.FlightSettings.Add(
                        new FlightSetting(
                            ...Variables...
                            ),
                     );

                    ...Here other values are seeded as FlightSettings...

                    // Save the data samples
                    _db.SaveChanges();

                    // DB has been seeded now
                }
            }
        }

    }

public static async Task CreateRoles(IServiceProvider serviceProvider)

        {
            //adding customs roles
            var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

            var UserManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();

            // Roles in the project
            string[] roleNames = { "Pilot", "Office" };

            IdentityResult roleResult;

            foreach (var roleName in roleNames)
            {
                // creating the roles and seeding them to the database
                var roleExist = await RoleManager.RoleExistsAsync(roleName);

                if (!roleExist)
                {
                    roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
                }
            }

            // create custom users
            var officeUser = new AppUser
            {
                UserName = "paulita",
                Email = "paulita@",
                Password = "paulita"
            };

            var pilots = new AppUser[] {
                new AppUser
                {
                    Name = "pablito",
                    IdentityDocument = 80421514,
                    EmployeeNumber = 52641958,
                    UserName = "pcastellanos",
                    Email = "pablito@",
                    Password = "pablito",
                    BornDate = new DateTime(1990, 6, 20)
                },
                new AppUser
                {
                    Name = "pedrito",
                    IdentityDocument = 1098808192,
                    EmployeeNumber = 62549214,
                    UserName = "privero",
                    Email = "pedrito@",
                    Password = "pedrito",
                    BornDate = new DateTime(1992, 8, 10)
                }
            };

            foreach (var pilot in pilots)
            {
                await UserManager.CreateAsync(pilot, pilot.Password);
                await UserManager.AddToRoleAsync(pilot, "Pilot");
            }

            await UserManager.CreateAsync(officeUser, officeUser.Password);
            await UserManager.AddToRoleAsync(officeUser, "Office");

            using (var _db = new AppDbContext(serviceProvider.GetRequiredService<DbContextOptions<AppDbContext>>()))
            {
                var myPilots = await UserManager.GetUsersInRoleAsync("Pilot");
                AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");
                var flightSettings = await _db.FlightSettings.ToListAsync();

                await _db.PilotTests.AddAsync(
                    new PilotTest
                    {
                        Pilot = myUser,
                        SimulationSetting = flightSettings[0]
                    }
                );

                // Save the data samples
                _db.SaveChanges();

问题

正如您在此行中所看到的:

var myPilots = await UserManager.GetUsersInRoleAsync("Pilot");

我向数据库请求角色为“Pilot”的所有用户。 我在创建PilotTest时遇到错误,因为在PilotTest中而不仅仅是引用相应的AppUser,它还会尝试再次创建AppUser,并且由于用户已经存在,VisualStudio会告诉我数据库中已经有一个条目Primay Key。

每个PiloTest都应该引用一个Pilot。 这是DB中的PilotTest表: PilotTestTableDB

我试着在这里添加一个Pilot:

AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");

但同样的事情发生了。

以下是classess:

public class PilotTest
    {
        // Unique ID
        [Key]
        public string Id { get; set; }

        // The pilot responsible for this test
        public AppUser Pilot { get; set; }

        // FlightSetting of the simulation
        public FlightSetting SimulationSetting { get; set; }

        ...Other variables...
    }

public class AppUser : IdentityUser
    {
        // Custom variables on users
        public string Name { get; set; }
        public int IdentityDocument { get; set; }
        public int EmployeeNumber { get; set; }
        public DateTime BornDate { get; set; }

        // For debugging purposes 
        public string Password { get; set; }
    }

我的理论是我做错了什么,但几天前我找不到任何解决办法。

对于您当前的defination密码paulita ,根据默认密码规则,它是无效的。 你可以改变下面的代码,检查result你会发现错误。

foreach (var pilot in pilots)
{
    var result = await UserManager.CreateAsync(pilot, pilot.Password);
    await UserManager.AddToRoleAsync(pilot, "Pilot");
}

如果您更喜欢此密码,则需要配置IdentityOptions

services.AddDefaultIdentity<AppUser>(options => {
    options.Password.RequireNonAlphanumeric = false;
    options.Password.RequireUppercase = false;
    options.Password.RequireDigit = false;
})

这是我现在的Seeds

public class Seeds
{
    public static void SeedDatabase(IServiceProvider serviceProvider)
    {
        // Seed DB
        using (var _db = serviceProvider.GetRequiredService<TestMVC2_1Context>())
        {
            Console.WriteLine("\n Looking for a database... \n");

            // Look for a database
            if (!_db.Database.EnsureCreated())
            {
                // Debug message
                string message = "\n There is already a database. \n";
                Console.WriteLine(message);

                // DB has been seeded before
            }
            else
            {
                // Debug message
                string message = "\n A new database has been created. \n";
                Console.WriteLine(message);
                // Save the data samples
                _db.SaveChanges();

                // DB has been seeded now
            }
        }
    }
    public static async Task CreateRoles(IServiceProvider serviceProvider)

    {
        //adding customs roles
        var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

        var UserManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();

        // Roles in the project
        string[] roleNames = { "Pilot", "Office" };

        IdentityResult roleResult;

        foreach (var roleName in roleNames)
        {
            // creating the roles and seeding them to the database
            var roleExist = await RoleManager.RoleExistsAsync(roleName);

            if (!roleExist)
            {
                roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
            }
        }

        // create custom users
        var officeUser = new AppUser
        {
            UserName = "paulita",
            Email = "paulita@",
            Password = "paulita"
        };

        var pilots = new AppUser[] {
            new AppUser
            {
                Name = "pablito",
                IdentityDocument = 80421514,
                EmployeeNumber = 52641958,
                UserName = "pcastellanos",
                Email = "pablito@",
                Password = "pablito",
                BornDate = new DateTime(1990, 6, 20)
            },
            new AppUser
            {
                Name = "pedrito",
                IdentityDocument = 1098808192,
                EmployeeNumber = 62549214,
                UserName = "privero",
                Email = "pedrito@",
                Password = "pedrito",
                BornDate = new DateTime(1992, 8, 10)
            }
        };

        foreach (var pilot in pilots)
        {
            var result = await UserManager.CreateAsync(pilot, pilot.Password);
            await UserManager.AddToRoleAsync(pilot, "Pilot");
        }

        await UserManager.CreateAsync(officeUser, officeUser.Password);
        await UserManager.AddToRoleAsync(officeUser, "Office");

        using (var _db = serviceProvider.GetRequiredService<TestMVC2_1Context>())
        {
            var myPilots = await UserManager.GetUsersInRoleAsync("Pilot");
            AppUser myUser = await UserManager.FindByNameAsync("pcastellanos");

            await _db.PilotTests.AddAsync(
                new PilotTest
                {
                    Pilot = myUser,
                }
            );

            // Save the data samples
            _db.SaveChanges();
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM