如何从MVC5中的Configuration中将新用户存储到数据库中?

时间:2014-09-10 20:45:19

标签: c# asp.net-mvc entity-framework csv asp.net-identity

我有一个继承自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");
        }

2 个答案:

答案 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();
    }
}