我正在使用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表的相同错误。这可以在服务器资源管理器中清楚地看到!
为什么会这样?
由于我创建了自己的上下文,这是否因为我使用两种不同的上下文而发生?在这种情况下,最佳做法是什么?
谢谢。
答案 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部分应该在那里。