迁移C#MVC ASP.NET
我想简单地解释一下这一点 这个代码有效迁移C#MVC ASP.NET,c#,asp.net,asp.net-mvc,user-roles,asp.net-roles,C#,Asp.net,Asp.net Mvc,User Roles,Asp.net Roles,我想简单地解释一下这一点 这个代码有效 protected override void Seed(RMQ.Models.ApplicationDbContext context) { var userStore = new UserStore<ApplicationUser>(context); var userManager = new UserManager<ApplicationUser>(userStore);
protected override void Seed(RMQ.Models.ApplicationDbContext context)
{
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
if (!context.Users.Any(t => t.UserName == "Admin@RMQ.com"))
{
var users = new ApplicationUser { Email = "Admin@RMQ.com", UserName = "Admin@RMQ.com", };
userManager.Create(users, "Password1!");
context.Roles.AddOrUpdate(r => r.Name, new IdentityRole { Name = "Admin" });
context.SaveChanges();
userManager.AddToRole(users.Id, "Admin");
}
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
所以我们有
(r=>r.Name)作为第一个参数。但我真的不明白,我们试图访问角色字段属性名。但我们什么也没做。然后是第二个参数,我们访问并创建了一个新的IdentityRole对象,并插入“Admin”作为传递其Name属性 第一个参数是键,它通过该键标识操作是添加还是更新。EF将按该列作为键搜索记录。如果找到一条记录,它将更新该记录或插入一条新记录。这是一个关于表达式的更复杂的问题。 此参数的目的是告诉EF要用于标识条目的字段,在本例中是名称字段 这与主键不同,因为它可以是自动生成的字段
我接受了这两个答案,因为它们都是正确的。但我选择了Praveens的答案,因为他添加了“else insert a new record”。但是Stefano提供给我的链接让我了解了AddOrUpdate是如何构造的。
context.Roles.AddOrUpdate(r => r.Name, new IdentityRole { Name = "Admin" });