我有一个继承自ApplicaitonUser的模型,定义如下:
public class Business : ApplicationUser
{
...
}
然后,在我的配置中,我读取CSV文件中的所有信息,并创建业务对象列表。然后,我想创建所有这些作为新用户并添加到数据库,并给他们一个默认密码(我以后填写电子邮件列表中的所有用户他们的密码,所以他们可以更改它)。我想我需要使用UserManager.CreateAsync方法,但我似乎无法从我的配置文件中引用它。
目前,我有类似的内容,我从CSV文件中读取了所有商业特定信息:
foreach (string csv in csvs)
{
using (CsvReader reader = new CsvReader(csv))
{
foreach (string[] values in reader.RowEnumerator)
{
businesses.Add(new Business
{
BusinessName = values[0],
Email = values[1],
Address = values[2],
City = values[3],
StateID = states.Single(s => s.StateCode == values[4]).StateID,
Zip = values[5],
Phone = values[6],
Fax = values[7],
SICCode = values[8],
Description = values[9],
Website = values[10]
});
}
}
}
然后,我想我需要一个与下面类似的foreach声明来回顾所有的业务,但我不知道这是否是正确的方法,即使它是,我怎么能从Configuration.cs文件访问UserManager?我似乎无法从配置中访问它。
foreach (Business b in businesses)
{
var result = await UserManager.CreateAsync(b, "MyPassword");
}
答案 0 :(得分:3)
对于访问UserManager,您可以创建一个新的:
new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
如果在Startup.Auth.cs中正确设置了,那么从当前的HttpContext中获取一个:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>()
现在,如果这是种子数据,这种逻辑可能不应该在Web应用程序本身内。如果您确实希望通过读取csv文件以编程方式进行种子设定,请考虑在本地与csv文件一起编写一个单独的控制台应用程序,并在需要为特定数据库执行此播种时运行此应用程序。
然后您也可以使用UserManager跳过此ApplicationUser基础结构,为简单起见,只生成您正在使用的数据库的数据库优先模型,并让EF像往常一样插入数据。
编辑:哦,是的,密码的事情。因此,您仍然可以使用UserManager基础结构来解决所有问题,或者如果您想绕过UserManager的其他部分,可以手动使用UserManager.PasswordHasher.HashPassword("Password")。答案 1 :(得分:2)
虽然公认的解决方案有效,但我认为这提供了更好的选择。这是一篇关于为我使用的数据库播种的文章:link。以下是我用来匹配您的情况的代码细分。
在DbContext构造函数中,您可以指定引用Configuration.cs文件的数据库初始值设定项。初始化程序的类型有几种选择,您可以找到它们here。
public ApplicationDBContext()
: base("DefaultConnection")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDBContext, IBCF.Core.Migrations.Configuration>());
}
指定后,在配置文件中,可以添加种子功能,使用CSV中的项目填充数据库。这样做可以让您将数据播种到数据库,而无需在Web项目中放置代码,也无需创建单独的应用程序。
internal sealed class Configuration : DbMigrationsConfiguration<IBCF.Core.ApplicationDBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(IBCF.Core.ApplicationDBContext context)
{
//Initialize managers
var userManager = new UserManager<Business>(new UserStore<Business>(context));
//Do something to populate your csvs variable
foreach (string csv in csvs)
{
using (CsvReader reader = new CsvReader(csv))
{
foreach (string[] values in reader.RowEnumerator)
{
var business = new Business
{
BusinessName = values[0],
Email = values[1],
Address = values[2],
City = values[3],
StateID = states.Single(s => s.StateCode == values[4]).StateID,
Zip = values[5],
Phone = values[6],
Fax = values[7],
SICCode = values[8],
Description = values[9],
Website = values[10]
};
userManager.Create(business, "MyPassword")
}
}
}
context.SaveChanges();
}
}