Как получить доступ к 2 DBContext на одной странице Razor - PullRequest
0 голосов
/ 19 июня 2019

На моей странице Razor я хотел бы использовать второй DBContext, который подключен к другой базе данных.

У меня есть два DBContext, которые подключаются к двум различным базам данных, которые прекрасно работают независимо в одном приложении.DB1 подключен к MS Sql Server, работающему под управлением Linux, это основная база данных.DB2 подключена к MS Sql Server на Windows Server 2016. Я могу создать CRUD для таблиц в DB1, и все функции работают правильно, я могу создать Read for View в DB2, и данные извлекаются, как и ожидалось.При создании новой записи в DB1 я хотел бы объединить данные из DB2.Как мне создать / получить доступ к DBContext для DB2 на странице Razor CRUD, созданной для DBContext для DB1.Я надеюсь это имеет смысл.Последние пару дней я пытался гуглить, как сумасшедший, и не смог найти решение.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

BattlFrog - спасибо за ответ.Это было не совсем то, что я искал, но это помогло мне выбрать лучший путь Gooogle.То, как я решил свою проблему, было с помощью «инъекции зависимости».Я просто добавил второй DBContext в конструктор PageModel.Затем в моем OnPostAsync () мне просто нужно было сослаться на DBContext.Это сработало для меня, но, поскольку я изучаю только C #, ASP.Net Core и Razor Pages, это может быть не лучшим подходом.Пожалуйста, поправьте меня, если я ошибаюсь.

    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();
        }
    }
0 голосов
/ 19 июня 2019

Рекомендуется не взаимодействовать напрямую с вашим DbContext в представлении, вы должны были бы выполнять свои вызовы в контроллере, затем заполнять 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 в представление. Затем в представлении вы будете делать то, что вы делаете, затем отправлять модель представления обратно в контроллер для сохранения в отдельных БД.

Вид:

@model MyApp.Models.StudentViewModel

<!-- Do stuff -->
...