如何填充Identity Framework表格&自定义表没有获取无效的对象名称

时间:2017-11-14 10:36:25

标签: c# asp.net-mvc-5 ef-code-first dbcontext

我正在使用ASP.NET MVC 5框架来实现一个简单的项目。在该项目中,我想使用Identity Framework Tables(用户,角色等)以及自定义表(学生,房东等)。

我还想用一些值初始化表格,因此我将以下函数添加到我的家庭控制器中:

    public void PopulateAspNetTables()
    {
        context = new ApplicationDbContext();

        // Define Users and insert them to IF database :
        // **********************************************
        var passwordHash = new PasswordHasher();
        string password = passwordHash.HashPassword("Password@123");

        ApplicationUser user1 = new ApplicationUser
        {
            UserName = "user1",
            Email = "user1@user1.com",
            PasswordHash = password
        };
        context.Users.AddOrUpdate(user1);
        context.SaveChanges();
    }

以及:

    public void PopulateOurDatabase()
    {

        dbCntxt = new DatabaseContext();

        stdnt = new Student {StudentID = 1, FirstName = "FN", LastName = "LN", Age = 27, Sex = "Male", ContactNumber = "123456", Email = "user1@gmail.com", AcademicYear = 1, AcademicDegree = "Electrical Engineering", AcademicSubject = "blabla" };
        dbCntxt.Students.AddOrUpdate(stdnt);
        dbCntxt.SaveChanges();

前两个函数将在Home Controller构造函数中调用:

    public class HomeController : Controller
    {
    private DatabaseContext dbCntxt;
    private ApplicationDbContext context;


    private Student stdnt;


    public HomeController()
    {

        PopulateOurDatabase();
        PopulateAspNetTables();
    }
....
....
}

现在问题是每当我在构造函数中调用这两个函数时,第一个函数正常工作,而第二个函数总是抛出错误:

SqlException: Invalid object name 'dbo.AspNetUsers'.

如果我改变调用函数的顺序,将正确创建AspNetUsers表,同时我得到关于Student表的相同错误。这可以在服务器资源管理器中清楚地看到!

为什么会这样?

由于我创建了自己的上下文,这是否因为我使用两种不同的上下文而发生?在这种情况下,最佳做法是什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

我没有测试,但使用"使用"关闭每个连接的关键字。

 public void PopulateOurDatabase()
{
   using (dbCntxt = new DatabaseContext())
   {
    stdnt = new Student {StudentID = 1, FirstName = "FN", LastName = "LN", 
    Age = 27, Sex = "Male", ContactNumber = "123456", Email = 
   "user1@gmail.com", AcademicYear = 1, AcademicDegree = "Electrical 
   Engineering", AcademicSubject = "blabla" };
    dbCntxt.Students.AddOrUpdate(stdnt);
    dbCntxt.SaveChanges();
   }

答案 1 :(得分:0)

我想我找到了问题的答案。出于某些测试原因,我删除了连接字符串的InitialCatalog部分,忘了再次添加它。经过大量的挖掘后,我发现,最有可能的是,由于我使用了两种不同的上下文,我需要告诉应用程序从哪个数据库开始。 因此,InitialCatalog部分应该在那里。