Entity framework 如何在一个页面中访问2个DBContext
在我的Razor页面中,我想使用连接到另一个数据库的第二个DBContext 我有两个DBContext,它们连接到两个不同的数据库,在同一个应用程序中独立工作。DB1连接到运行在Linux机器上的MS Sql Server,这是主数据库。DB2连接到Windows Server 2016上的MS Sql Server。我可以为DB1中的表创建CRUD,并且所有函数都可以正常工作,我可以为DB2中的视图创建Read,并按照预期检索数据。 在DB1中创建新记录时,我希望合并DB2中的数据。如何在为DB1的DBContext创建的CRUD页面中创建/访问DB2的DBContext。Entity framework 如何在一个页面中访问2个DBContext,entity-framework,asp.net-core,razor,entity-framework-6,razor-pages,Entity Framework,Asp.net Core,Razor,Entity Framework 6,Razor Pages,在我的Razor页面中,我想使用连接到另一个数据库的第二个DBContext 我有两个DBContext,它们连接到两个不同的数据库,在同一个应用程序中独立工作。DB1连接到运行在Linux机器上的MS Sql Server,这是主数据库。DB2连接到Windows Server 2016上的MS Sql Server。我可以为DB1中的表创建CRUD,并且所有函数都可以正常工作,我可以为DB2中的视图创建Read,并按照预期检索数据。 在DB1中创建新记录时,我希望合并DB2中的数据。如何在为
我希望这是有道理的。在过去的几天里,我一直在疯狂地用谷歌搜索,但没有找到解决方案。最好不要在视图中直接与DbContext交互,您可以在控制器中进行调用,然后用每个db的值填充ViewModel,然后在视图和控制器之间传递ViewModel 假设DB1有我们的学生数据,DB2没有教师数据。我们需要模型:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Teacher
{
public string Id { get; set; }
public string Name { get; set; }
}
public class StudentViewModel
{
public Student Student { get; set; }
public Teacher Teacher { get; set; }
}
在控制器中,我们从每个数据库获取数据,然后在ViewModel中合并:
var studentData = context1.ModelA.GetStudent(studentId);
var teacherData = context2.ModelA.GetTeacher(teacherId);
var viewModel = new StudentViewModel()
{
Student = studentData,
Teacher = teacherData
};
return View(viewModel);
在控制器的返回中,我们将viewModel返回到视图。然后在视图中执行您正在执行的操作,然后将viewmodel发布回控制器以保存在单独的Dbs中
视图:
@model MyApp.Models.StudentViewModel
最好不要在视图中直接与DbContext交互,您可以在控制器中进行调用,然后用每个db的值填充ViewModel,然后在视图和控制器之间传递ViewModel
假设DB1有我们的学生数据,DB2没有教师数据。我们需要模型:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Teacher
{
public string Id { get; set; }
public string Name { get; set; }
}
public class StudentViewModel
{
public Student Student { get; set; }
public Teacher Teacher { get; set; }
}
在控制器中,我们从每个数据库获取数据,然后在ViewModel中合并:
var studentData = context1.ModelA.GetStudent(studentId);
var teacherData = context2.ModelA.GetTeacher(teacherId);
var viewModel = new StudentViewModel()
{
Student = studentData,
Teacher = teacherData
};
return View(viewModel);
在控制器的返回中,我们将viewModel返回到视图。然后在视图中执行您正在执行的操作,然后将viewmodel发布回控制器以保存在单独的Dbs中
视图:
@model MyApp.Models.StudentViewModel
BattlFrog-感谢您的回复。这并不是我想要的,但它确实让我走上了一条更好的路。我是如何通过使用“依赖注入”来解决我的问题的。我只是将第二个DBContext添加到PageModel的构造函数中。然后在OnPostAsync()中,我只需引用DBContext。
这对我来说很有效,但因为我只学习C#、ASP.Net核心和Razor页面,所以这可能不是最好的方法。如果我错了,请纠正我
public class IndexModel : PageModel
{
DBContext1 _context1;
DBContext2 _context2;
public IndexModel(DBContext1 context1, DBContext2 context2)
{
_context1 = context1;
_context2 = context2;
}
public async Task<IActionResult> OnPostAsync()
{
IList<ClassName> listName = await _context2.ObjectName.ToListAsync();
// do some stuff here
await _context1.SaveChangesAsync();
}
}
公共类索引模型:PageModel
{
DBContext1_context1;
DBContext2_context2;
公共索引模型(DBContext1-context1,DBContext2-context2)
{
_context1=context1;
_context2=context2;
}
公共异步任务OnPostAsync()
{
IList listName=await_context2.ObjectName.tolistSync();
//在这里做些事情
wait_context1.SaveChangesAsync();
}
}
BattlFrog-感谢您的回复。这并不是我想要的,但它确实让我走上了一条更好的路。我是如何通过使用“依赖注入”来解决我的问题的。我只是将第二个DBContext添加到PageModel的构造函数中。然后在OnPostAsync()中,我只需引用DBContext。
这对我来说很有效,但因为我只学习C#、ASP.Net核心和Razor页面,所以这可能不是最好的方法。如果我错了,请纠正我
public class IndexModel : PageModel
{
DBContext1 _context1;
DBContext2 _context2;
public IndexModel(DBContext1 context1, DBContext2 context2)
{
_context1 = context1;
_context2 = context2;
}
public async Task<IActionResult> OnPostAsync()
{
IList<ClassName> listName = await _context2.ObjectName.ToListAsync();
// do some stuff here
await _context1.SaveChangesAsync();
}
}
公共类索引模型:PageModel
{
DBContext1_context1;
DBContext2_context2;
公共索引模型(DBContext1-context1,DBContext2-context2)
{
_context1=context1;
_context2=context2;
}
公共异步任务OnPostAsync()
{
IList listName=await_context2.ObjectName.tolistSync();
//在这里做些事情
wait_context1.SaveChangesAsync();
}
}
如果控制器中有上下文,则可以使用@inject EntitiesContext db
。但是,正如BattlFrog在回答中提到的,建议在控制器中执行此操作。如果控制器中有上下文,则可以使用@injectEntityContext db
。然而,正如BattlFrog在他的回答中提到的,在控制器中这样做是明智的。