Как правильно инициализировать DBContext в WPF приложении с использованием MVVM-паттерна?

278
21 сентября 2017, 13:24

Где инициализировать DBContext (DB = new DBContext()), чтобы не нарушать принципы и правила MVVM-паттерна в WPF приложении?

Приложение состоит из главного окна MainWindow с управляемыми(дочерними) UserControl:

<Window x:Class="TestManager.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestManager.View"
        xmlns:vm="clr-namespace:TestManager.ViewModel"
        mc:Ignorable="d"
        Title="Склад" Height="600" Width="800">
    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:ViewModelPeople}">
            <local:ViewPeople/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:ViewModelMainLogs}">
            <local:ViewMainLogs/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ContentPresenter x:Name="Pages"  Content="{Binding SelectedViewModel}"/>
    </Grid>
</Window>

ViewModelMainWindow.cs:

    class ViewModelMainWindow : ViewModelBase
{
    /// <summary>
    /// Выбранный UserControl
    /// </summary>
    private object selectedViewModel;
    public object SelectedViewModel
    {
        get { return selectedViewModel; }
        set { selectedViewModel = value; OnPropertyChanged("SelectedViewModel"); }
    }
    public ViewModelMainWindow()
    {
        SelectedViewModel = new ViewMainLogs(); //Инициализация при запуске приложения
    }
}

P.s. насколько правильно и логично использовать один экземпляр DBContext для всего проекта?

Answer 1

В MVVM база данных — это модель. Соответственно и инициализировать её нужно там. И раз работа с базой данных обычно медленная, а EF не многопоточный, то инициализировать нужно в том потоке, в котором вы будете работать с базой (и это должен быть не главный поток).

READ ALSO
C#, изменить размеры компонента MaskedTextBox

C#, изменить размеры компонента MaskedTextBox

Требуется изменить размеры, а именно высоту(height)Возможно ли? так просто он не меняет

263
Как сделать combobox на считку/запись 2-х байтов по смещению?

Как сделать combobox на считку/запись 2-х байтов по смещению?

Как в приложении сделать combobox на считку/запись 2-х байтов в "Hex" перевернутом по смещению 0x324 из файла(Перевернутый Hex значит например: 300 десятичное...

227
Уведомление об изменении в классе

Уведомление об изменении в классе

Здравствуйте! При создании приложения в WPF у меня возникла одна проблема, а именно: по нажатию клавиши Edit в главном окне MainWindow я хочу менять...

262
Как решить задачку на c#?

Как решить задачку на c#?

Подскажите как решить задачку:

323