Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在一个页面中访问2个DBContext_Entity Framework_Asp.net Core_Razor_Entity Framework 6_Razor Pages - Fatal编程技术网

Entity framework 如何在一个页面中访问2个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中的数据。如何在为

在我的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。
我希望这是有道理的。在过去的几天里,我一直在疯狂地用谷歌搜索,但没有找到解决方案。

最好不要在视图中直接与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在他的回答中提到的,在控制器中这样做是明智的。